Agent rules and guardrails — curated ADRs plus new rules auto-synced from changelog when architecture shifts. One decision per rule.
Recent shifts · changelog
config/ship-it-week.json)ship-it-pricingindex, follow) so both A and B can be discovered for A/B/ship-it-15aug — weekend feel, prep, and plain-language build/ship detail for non-tech visitors; soft cross-link to the short pitch/ship-it-15aug-b — concrete non-tech clarity (live URL, not becoming an engineer, workspace vs chatbot) while keeping sales close language; soft cross-link to the detailed pageAuto-synced from unreleased changelog. Agent rules with <!-- adr --> become ADRs below.
Agent rules (ADRs)
ADR-001
www subdomain — same as apex, www footer note
Serve one landing page for apex and www; only the footer may differ by hostname — never maintain a second homepage.
ADR-002
No root `/index.html`
Never add a root `/index.html` — route every hostname explicitly in `vercel.json`.
ADR-003
Host-based subdomain routing
One repo, many front doors — every new surface gets a hostname + rewrite block in `vercel.json`; never a new Vercel project by default.
ADR-004
Centralized contact config
Contact email and WhatsApp live only in `config/contact.json` — run `sync-contact.js` before deploy; never edit contact inline in HTML.
ADR-005
Branding — Ankit Zen / ankitzen.com
Display name is **Ankit Zen**; domain shorthand is **ankitzen.com** — retire ankeitzen everywhere; agent must grep before shipping copy.
ADR-006
ankitzen.com — brand protection, not SEO
SEO builds only on `differentthandefault.com`; `ankitzen.com` is a 301 alias to portfolio — never publish duplicate content on it.
ADR-007
Blog — static HTML, no CMS
Blog posts are static HTML + `posts.json` index — no CMS, no database; agent creates files on request.
ADR-008
Low-friction contact + email list
Hello form + visible email coexist — no scary subscription copy; form posts to `/api/contact` via Resend.
ADR-009
Portfolio curation — one project at a time
Unreviewed projects stay disabled with badge **"Yet to be reviewed · AZ"** — enable one case study at a time after human review.
ADR-010
Public todo with voting and feedback
Roadmap priorities are public at `/todo` — votes and feedback inform what ships; agent links it from landing and portfolio.
ADR-011
One Supabase for platform, not per project
One platform Supabase for shared features (todo, votes, feedback, analytics) — no new Supabase project per micro-feature.
ADR-012
WorkForce and Cursor AI School are separate stories
WorkForce and Cursor AI School are separate products — never cross-reference or blend copy between them.
ADR-013
Cursor AI School — program shape
School copy reflects fixed program shape — 6 months, ₹10k/month, cohort of 5, founder-sponsored — agent does not invent pricing.
ADR-014
WorkForce case study — honest demo framing
WorkForce is a demo of past private work — no fake stats, no public pricing; blur PII; CTA is contact for custom deploy.
ADR-015
Agent-driven project documentation
Meaningful change → update `docs/CHANGELOG.md` and/or `docs/DECISIONS.md` in the same session — no session notes; git is memory.
ADR-016
Portfolio tone — humble assertiveness
Portfolio tone balances confidence and humility — deep career story on `/work/journey/`; main page stays short.
ADR-017
Drop www footer easter egg — one School CTA
One School CTA per page — remove duplicate footer pitches before adding new ones.
ADR-018
www footer — DNS note back, one School mention
Apex and www each show exactly one School CTA — www gets DNS/subdomain note; apex gets meta-footer School line; never both lines on the same…
ADR-019
Social pipelines — public drafts, no paid API
Social posts draft from shipped builds (blog, todo projects, CDL chapters, showcase pages) — same builds on X and LinkedIn; X gets short hoo…
ADR-020
Cursor AI School — institutional batch track
Institutional track is separate from ADR-013 founder pricing — agents cite ADR-020 for batch fees, ADR-013 for founder fees. Do not say "ins…
ADR-021
Public thinking page — forks before decisions
`/todo` mixed ops tasks with one-line votes. `docs/THINKING.md` held richer "this vs that" reasoning but had no public URL. Visitors should …
ADR-022
Ek Alag Chashma — Instagram series on /blog
Instagram reels on society, women, and inequality get strong reach via long captions. That voice is distinct from builder/portfolio copy and…
ADR-023
Blog two-voice hub — Ek Alag Chashma + Building
Culture writing (Ek Alag Chashma) and builder content (changelog, decisions, thinking, school, work) lived on the same `/blog` index without…
ADR-024
Cursor AI School — individual 7-day workshop track
Individual workshop pricing is ADR-024 (₹2,000 flat, 7 days). Founder fees cite ADR-013; institutional batch fees cite ADR-020. Individuals …
ADR-025
Dynamic OG images — `/api/og`
When no page shot exists, social preview images use `/api/og` with `title`, `label`, `subtitle`, and `type` query params — not static `og/dt…
ADR-026
Portfolio positioning — founding product builder + enablement
Portfolio and landing framed separate paths — co-founder/CPO “one right opportunity” vs Cursor AI School as a standalone product. “Person yo…
ADR-027
Opportunity OS portfolio — personal demo, not product launch
Opportunity OS (first instance in `rishiajofficial/opportunity-ajos`) is a profile-driven discovery system with fit scoring and apply-ready …
ADR-028
Engagement horizon — multi-year depth, not contractor handoff
Outreach page and portfolio copy framed embedded work as 6–12 months with handoff ("when I step back"). User intent is the opposite: one dee…
ADR-029
Dual analytics — Umami + Vercel
Vercel Web Analytics — re-enabled alongside Umami (`vercelInsights: true` in `config/analytics.json`); was off since Umami deploy on 3 Jul
ADR-030
School brochure email gate
School brochure email wall — email field on `/school` (or `/school/brochure`) before the detailed curriculum brochure; Resend audience sourc…
ADR-031
Umami as primary analytics
**Umami analytics** — Vercel project `dtd-umami` at `analytics.differentthandefault.com`; Supabase platform DB; `config/analytics.json` + `s…
ADR-032
Sitemap lists indexable content only, not every public URL
`sync-docs.js` sitemap includes essays, topic hubs, School/CDL pillars, `portfolio.differentthandefault.com`, and `/decisions` hub only. Exc…
ADR-033
Owner login — cross-subdomain session
Hidden `/owner` + `DTD_OWNER_PASSWORD` env. Signed HttpOnly cookie on `.differentthandefault.com`. When owner: skip Umami + Vercel Analytics…
ADR-034
X (Twitter) pipeline transformed to insight-first content philosophy
X (Twitter) pipeline transformed to insight-first content philosophy — tweets lead with observations, insights, and contradictions instead o…
ADR-035
DTD Portfolio landing
DTD Portfolio landing — repositioned from generic builder to curated gallery of unconventional lives; short nominate/request form (profile l…
ADR-036
Page shots on Supabase Storage for OG + pipeline
Capture 1200×630 first-fold screenshots with Playwright (`scripts/capture-page-shots.js`), upload to Supabase Storage bucket `og-shots`, and…
ADR-037
Owner-only Search Console insights
`/insights` and `GET /api/analytics/gsc` require an owner session. Do not link Insights from the public footer or sitemap. Keep GSC credenti…
ADR-038
Portfolio replaces Portraits hub
Landing “What inspires this” links to `https://portfolio.differentthandefault.com/`. Do not recreate `/people` as a separate gallery. `/peop…
ADR-039
School subdomain as full school site
Canonical Cursor AI School product site is `school.differentthandefault.com` (`school-site/` tree). Apex `/school/*` stays as legacy pages (…
ADR-040
Start Your Journey path + coaching paywall
`/start-your-journey/` is the apex entry for people exploring a non-default life path. Homepage top-right CTA links here. Inspiration links …
ADR-041
Thinking resolutions — owner-gated, optional Todo follow-up
`/thinking` clear/write requires `requireOwner()`. Persist to Supabase `thinking_resolutions` via `/api/todo?scope=thinking` and actions `th…
ADR-042
School subdomain — workshop sales at `/7dayworkshop`
`school.differentthandefault.com/` stays the **full school hub** (ADR-039 paths: founder, individual, institutions, partner, apply, brochure…
ADR-043
Whats Happening replaces investor fund page
True to Myself `/fund` investor stub repositioned as `/whatshappening` — story of the directions underway (School, building in public, Start…
ADR-044
Homepage one-offering spine
Apex homepage (`landing/index.html`) leads with one offering — from “I don’t want the template” to a non-default life you can fund. First vi…
ADR-045
Workshop live feedback + public pulse
Cohort check-ins live at `school.differentthandefault.com/live-feedback`; public aggregates at `/workshop-pulse`. No login. Identity = norma…
ADR-046
Student builder showcase + owner inbox
Student builds submit at `school.differentthandefault.com/showcase/submit`; public gallery at `/showcase` shows **approved only**. Anyone ma…
ADR-047
Supabase-native CRM on owner desk
All DTD leads/submissions funnel into `crm_contacts` (unique by lowercased email) + `crm_events` timeline. Stage pipeline: `new` → `contacte…
ADR-048
Cofounder page on work portfolio
Public cofounder invitation lives at `work.differentthandefault.com/cofounder` only — never a parallel page on `ankitzen.com` (301 brand ali…
ADR-049
Solopreneur Journey playbook + funnel ladder
Free solopreneur playbook lives at `/solopreneur-journey/` (hub + email unlock) and `/solopreneur-journey/read/` (full chapters, `noindex`, …
ADR-050
First-party anonymous visitor journeys
Owner `/owner/journeys` — anonymous visitor session stories with Today / 7d / 30d / custom date range; first-party `page_events` now store v…
ADR-051
Local Cursor usage profile snapshot
Owner `/owner/usage-profile` — authenticated Cursor work-pattern profile from a generated local transcript + git snapshot, with an honest “U…
ADR-052
Owner Ideas desk + /checkin command
Park pursue-later sparks on owner `/owner/ideas/` in Supabase `owner_ideas` via `/api/todo?scope=ideas` and actions `ideas_create` / `ideas_…
ADR-054
School blog editorial queue on owner desk
Planned school posts live in `config/school-blog-queue.json` (`upcoming` + `shipped`, default `cadenceDays: 3`). Owner Overview (`/owner/`) …
ADR-056
Meta Pixel for school conversion ads
Meta Pixel ID lives in `config/analytics.json` → `metaPixel.pixelId`; `node scripts/sync-analytics.js` regenerates `assets/analytics.js`. Ba…
ADR-053
Razorpay Standard Checkout on school-apply
Razorpay Standard Checkout for school workshops — create-order + signature verify multiplexed on `/api/school-apply?action=create-order|veri…
ADR-055
Ship It Week dated funnel
Dated Ship It Week funnel lives at `school.differentthandefault.com/ship-it-15aug` (closed page, minimal nav). Pricing + schedule in `config…
ADR-057
Dated workshops live only on /upcoming
Dated school workshops (fixed calendar dates) are listed only on `school-site/upcoming/index.html` (`/upcoming`). Hub, evergreen workshop pa…