Example Modifications
Six concrete customizations, start to finish. Each includes:
- Which files to share with the AI
- The prompt you can adapt
- What you should expect the AI to produce
- How to verify the change worked
These are real customizations buyers have shipped. Adapt them to your needs.
1. Add a custom field type
Goal: Add a "URL" field type to Track's custom fields, alongside the existing text / number / date / select types, that renders as a clickable link.
Files to share
CLAUDE.mdsrc/features/custom-fields/types.tssrc/features/custom-fields/FieldRenderer.tsxsrc/features/custom-fields/FieldForm.tsxsrc/features/custom-fields/FieldEditor.tsx(the admin UI to define custom fields)
Prompt
I want to add a "URL" field type to Track's custom fields. It should:
- Appear as an option in the custom-field-type dropdown in
FieldEditor- Render as a clickable external link (target="_blank", rel="noopener") in
FieldRenderer- Validate as a URL in
FieldForm(accept http/https only, show an inline error otherwise)- Store the value as text in the database — no schema change needed because
custom_field_values.valueis alreadytextDon't introduce new dependencies. Use the URL constructor for validation. Match the existing code style in the types.ts file.
Expected result
The AI:
- Adds
"url"to theFieldTypeunion intypes.ts - Adds a URL icon and label to the type-picker in
FieldEditor - Adds a
urlcase to the switch inFieldRendererthat renders an<a>with the right attributes - Adds a validator in
FieldFormthat doestry { new URL(value) } catch { return 'Invalid URL' }
How to verify
npm run dev- Go to Settings → Custom Fields → New Field
- Pick "URL" from the type dropdown, save
- Add a value to that field on a contact
- Confirm it renders as a clickable link
- Try
foo.barand confirm validation fails
2. Change the color scheme
Goal: Replace Track's default amber accent with your company's deep teal.
Files to share
CLAUDE.mdsrc/theme.csstailwind.config.ts(if the product uses it — some ARK products use Tailwind 4's CSS-only config)
Prompt
Replace Track's default accent color (
#f59e0b) with#0f766ethroughout the theme. That's our company's deep teal. Also pick a readable contrast color for text that sits on top of the accent (white or off-white depending on what you think looks best on#0f766e).Only change
src/theme.css. Don't touch component files — the tokens flow through via CSS variables.
Expected result
The AI updates these tokens in src/theme.css:
--ark-accent: #0f766e--ark-accent-contrast: #ffffff(or#f0fdfa, explained)- Any derived tokens (hover, active, subtle background) recomputed from the new accent
How to verify
npm run dev- Check the sidebar, primary buttons, active states
- Check the email templates if any ship with an accent color —
some live in
supabase/functions/*/templates/and may need a second small edit
3. Add a CSV export button
Goal: Export the filtered contacts list from Track as a CSV.
Files to share
CLAUDE.mdsrc/features/contacts/ContactList.tsxsrc/features/contacts/useContactsQuery.ts(or equivalent — wherever the list query lives)src/lib/export-csv.ts(if it exists — most ARK products include a base CSV helper)
Prompt
Add a "Export CSV" button to the contacts list toolbar in
ContactList.tsx. When clicked, it should export the currently filtered contacts (respecting any search or filter state) as a CSV with these columns:name,company,phone,created_at, plus any custom fields the workspace has defined.
- Use the existing
exportToCsvhelper insrc/lib/export-csv.tsif it exists; otherwise write a minimal helper usingBlob+URL.createObjectURL(no new dependencies).- The filename should be
contacts-{yyyy-mm-dd}.csv.- Keep the button styled consistently with other toolbar actions.
Expected result
- A new button in the contacts toolbar
- Either a use of the existing helper, or a small new helper function
- The download fires the same list query that's already on screen, re-running without pagination to get the full filtered set
How to verify
npm run dev- Apply a filter (e.g., by tag or owner)
- Click Export CSV
- Open the file in Spreadsheet / Numbers / Excel
- Confirm the row count matches the filtered view and the columns are right
4. Create a new dashboard view
Goal: Add an "Executive Summary" dashboard to Track that shows pipeline value, new contacts this week, and top deals.
Files to share
CLAUDE.mdsrc/pages/Dashboard.tsx(the existing dashboard — so the AI can match its style)src/features/reports/(if the product has a reports module)src/App.tsx(for routing — the AI needs to add the route)src/components/Sidebar.tsx(to add the nav link)
Prompt
Add a new dashboard page at
/dashboard/executivecalled "Executive Summary". It should show:
- Pipeline value card — sum of all open deals, styled like the existing dashboard metric cards
- New contacts this week — count of contacts with
created_atin the last 7 days, with a spark line showing the prior 4 weeks for context- Top 5 deals by value — a simple table with deal name, company, value, stage
Match the styling and layout patterns used in
src/pages/Dashboard.tsx. Add a sidebar link under the existing "Dashboard" item. Only admins should see this view — follow the existing admin-gating pattern (checkprofile.role === 'admin').
Expected result
- A new file at
src/pages/ExecutiveDashboard.tsx - A new route in
App.tsx - A new sidebar entry, visible only to admins
- Three queries (pipeline sum, new-contacts count, top-deals) using the existing Supabase client
- Components matching the existing dashboard style
How to verify
- Log in as an admin
- Click the new Executive Summary link
- Confirm the three cards render with real data from your database
- Log in as a non-admin user and confirm the link and route are hidden
- Try hitting
/dashboard/executivedirectly as the non-admin to confirm the route guard works
5. Add a notification integration (Discord)
Goal: When a new deal is won in Track, post a celebratory message to a Discord channel.
Files to share
CLAUDE.mdsrc/features/integrations/— the whole directory, so the AI can follow existing integration patternssrc/lib/notify.tssupabase/functions/track-automation-runner/— if the notification should be triggered from the automation runner.env.example— to see how secrets are declared
Prompt
Add a Discord integration: when a deal's stage changes to "Won", post a message to a configured Discord webhook URL.
- Add a workspace setting
discord_webhook_url(text, nullable) in theworkspace_settingstable — write the migration.- Add a
notifyDiscord(message)helper insrc/lib/notify.tsthat POSTs to the webhook. If the webhook URL is unset, it's a no-op.- Hook it into the deal-stage-change path (wherever that lives — it's probably a trigger or an Edge Function; please find it and tell me where it is before writing code).
- The message should be: "🎉 Deal won: — $"
Don't call the webhook from client code — it should go through an Edge Function so the webhook URL never touches the browser.
Expected result
- Migration adding the
discord_webhook_urlcolumn notifyDiscordhelper that runs server-side only- An Edge Function (or modification to an existing one) that calls
notifyDiscordwhen a deal is won - No client-side reference to the webhook URL
How to verify
- Create a Discord webhook in a test server
- Set the URL via the settings UI (or SQL editor if no UI yet)
- Move a test deal to "Won"
- Confirm the Discord message appears within a few seconds
6. Modify the sidebar layout
Goal: Split the Track sidebar into "Work" (boards, tasks) and "People" (contacts, companies) sections with collapsible headers.
Files to share
CLAUDE.mdsrc/components/Sidebar.tsxsrc/App.tsx(for the list of routes)
Prompt
Restructure the Track sidebar into two collapsible sections:
- Work: Boards, Tasks, Automations
- People: Contacts, Companies
The section headers should be small, uppercase, muted text with a chevron that toggles the section open/closed. Default: both sections expanded. Persist the open/closed state in
localStorageunder a key liketrack.sidebar.sections.Keep everything else in
Sidebar.tsxthe same — only restructure the nav links. Match the existing styling (Tailwind classes, no new dependencies).
Expected result
- A restructured
Sidebar.tsxwith two<SidebarSection>-style groups - A small chevron toggle per section
localStoragepersistence of the open state
How to verify
npm run dev- Confirm the sidebar now shows two collapsible groups
- Toggle each group open/closed and refresh the page
- The collapsed state persists across reloads
A few meta-lessons from these examples
Scope each prompt
Every example above changes one thing. If you try "add all six of these in one session," you'll get a diff that's hard to review and impossible to roll back cleanly. One feature, one commit, one test pass.
Always test before deploying
Every "How to verify" section above is mandatory, not optional. AI tools produce plausible-looking code that sometimes doesn't work. Running it locally catches 95% of issues in 30 seconds.
Name the files
Notice every prompt includes explicit file paths ("in
ContactList.tsx"). AI tools use these as anchors. A prompt like
"add a button somewhere" produces a button in an arbitrary location;
"add a button to the toolbar in ContactList.tsx" produces exactly
what you want.
Say what not to touch
"Don't introduce new dependencies," "don't change the schema,"
"don't touch src/lib/license.js." These negatives keep AI tools
from well-meaning refactors that aren't in scope.
Where to go next
- Best Practices — prompting habits, testing workflow, modification changelogs
- Using Claude Code — the full end-to-end session flow
- Which Files to Share — per-product file maps for tasks not covered above