Before You Customize
Complete the identity, repository, CI, and local-baseline handoff before you change product behavior.
On this page
- 1
Rewrite the starter identity in files and folders
Choose the product name, short name, domain, support address, sender identity, audience, and one-sentence promise. Search tracked files and folders for old names, then update shared defaults before editing individual screens. Rename only customer-facing paths and copy; keep stable database, event, role, and provider identifiers unless a migration is planned.
- Product name and short name in files and folders
- Public and canonical URLs
- Support and sender addresses
- Logo, favicon, and social metadata
- Legal, SEO, billing, and email copy
textgit grep -n -i -E "shipflash|acme" - 2
Create your repository before disconnecting the old one
Create an empty private repository in the customer organization first. Keep the local history by default, remove only the old remote, add the new remote, and push the first product-owned baseline.
- Create the remote first
- Verify the old remote before removing it
- Use a private repository
- Do not delete .git unless you intentionally want to discard history and have a backup
textgit status git remote -v git remote remove origin git remote add origin <your-repository-url> git branch -M main git add . git commit -m "chore: initialize customer repository" git push -u origin main - 3
Pause GitHub Actions during foundation work
The application CI workflow runs quality, database, build, and browser gates. Disable Actions from repository settings or add a temporary explicit job condition such as if: false; comments alone do not stop a workflow from running.
- Keep .github/workflows/ci.yml and codeql.yml
- Record who will re-enable CI
- Do not delete checks to hide failures
- Re-enable CI before staging or production
- 4
Establish a verified local baseline
Install the pinned toolchain, copy the environment template, use an isolated development Supabase project, and run the repository checks before adding product-specific behavior.
- No production secrets locally
- No shared production database
- Record the baseline commit and known warnings
- Use migrations and generated types as the database contract
textpnpm install --frozen-lockfile cp .env.example .env.local pnpm run doctor pnpm run quality - 5
Write the product brief before adding features
Define the target customer, painful job, core workflow, paid outcome, roles, tenancy model, sensitive data, revenue model, support promise, and success metric.
- Customer and primary job
- Free, recurring, one-time, metered, or credit revenue
- Roles, ownership, and authorization
- Source-of-truth data and retention
- First measurable success signal
- 6
Choose modules deliberately
For every shipped domain, record keep, adapt, disable, or remove. Hide optional navigation before permanent removal, and trace routes, data, storage, jobs, webhooks, tests, and documentation first.
- 7
Build one vertical slice
Implement the smallest workflow that proves the product promise through a thin route, domain UI, validation, authorization, service, persistence, observability, and focused tests.
- Schema and constraints
- Persistence and source of truth
- Business rules and provider boundary
- Loading, empty, error, pending, and success states
- Retry, duplicate, and permission behavior
- 8
Re-enable gates and release gradually
Turn CI back on, run the full quality and build gates, deploy staging, verify provider test modes and production-like journeys, then release to a small cohort before widening access.
textpnpm run quality:full pnpm run build
Product files to update in the identity pass
Code-owned identity
Replace safe fallback values used during boot, metadata generation, links, and public copy before database settings load.
src/config/app-identity.tssrc/lib/config.ts
Runtime branding
Update the branding contract, admin actions, public reads, and dashboard form that control logos, favicon, appearance, and product identity.
src/features/branding/server/actions.tssrc/features/branding/server/queries.tssrc/features/branding/shared/settings.tssrc/features/branding/ui/form.tsx
Website and SEO settings
Update canonical URL, public site values, locale, SEO defaults, and the admin settings surfaces that validate them.
src/features/settings/server/actions/website-settings.tssrc/features/settings/server/actions/seo-settings.tssrc/features/settings/ui/website-form.tsxsrc/features/settings/ui/seo-form.tsx
Public content and application email
Replace editorial, legal, notification, and template copy without changing event keys, recipient resolution, or delivery guarantees.
src/features/cms/shared/documents/kinds.tssrc/features/cms/server/documents/queries/public.tssrc/features/notifications/ui/templates/dashboard.tsx
Reference paths are relative to the Shipflash-Product checkout.
Repository and automation handoff locations
These references are intentionally visible because they are the files and folders involved in the first customer-owned handoff.
| Area | Files and folders | Purpose |
|---|---|---|
| Repository | .git/config, README.md, package.json, pnpm-lock.yaml | Verify the old remote, establish the customer-owned remote, and record the first baseline. |
| CI and security automation | .github/workflows/ci.yml, .github/workflows/codeql.yml, package.json | Pause and re-enable quality, database, build, browser, and code-scanning checks deliberately. |
| Local and release contract | .env.example, .nvmrc, pnpm-workspace.yaml, package.json | Use the pinned toolchain and canonical environment and command inventory. |
| Customer-facing content | docs/README.md, docs/getting-started/launch.md, docs/extend/extend-shipflash.md | Keep the product journey, launch rules, and extension guidance aligned with the customized product. |
| Feature boundaries | src/app/, src/features/, src/lib/, supabase/migrations/, vitest/, e2e/ | Use the established route, domain, infrastructure, database, test, and browser-journey ownership model. |
Handoff rules to keep
- Before the first push, git remote -v must show only the customer-owned repository.
- Never commit .env.local, provider secrets, webhook secrets, database passwords, or private API keys.
- Do not use a global search-and-replace for stable database identifiers, roles, event keys, or provider ids.
- Commit the identity and repository handoff separately from the first product feature.
- Use feature branches for product work and keep main deployable once CI is restored.
- Do not weaken auth, billing, webhook, RLS, retention, or rate-limit checks to make the first build pass.
Connect the foundation
Set the first env values, Supabase baseline, auth providers, email, and hosting path before feature work.
Plan product scope
Turn the brief into keep, adapt, disable, or remove decisions for every shipped module.
Build the first feature
Follow one complete route-to-test vertical slice through the Product architecture.
Use safe recipes
Apply focused customization patterns without turning a route or generic helper into a second architecture.
Prepare launch
Move from a verified baseline to staging, providers, production, and recovery readiness.