| 2026-11-06 |
Public Site |
accepted |
The public site is temporary: speed over maintainability, no CSS modules, i18n or extra strictness; data, URL and shared-code rules still bind, and its replacement follows every rule (D256); contracts that outlive it (D257); content component map with zod props (D260). |
| 2026-11-06 |
Native UI |
accepted |
ui builds primitives on native HTML with no UI library; Mantine leaves the App in lesson M1, before I1 (D255). |
| 2026-11-06 |
Design Tokens |
accepted |
ui names the tokens; Sidekick's values ship as an opt-in theme file; a contract check fails on an unset token (D254). |
| 2026-11-06 |
CSS Modules |
accepted |
CSS modules for every component in the App and packages, a named list of global files, apps/www exempt (D47 revised). |
| 2026-11-06 |
The Site and Content |
accepted |
apps/www is a site element that may import only foundation (D258); content/ holds content only, guarded by a check script in CI and pre-commit (D259). |
| 2026-11-06 |
Internationalization |
accepted |
ui holds no words, labels are string props (D249); locale and time zone from the device, a tz cookie, no settings yet (D242 revised, D253); the temporary site leaves i18n out (D241 revised). |
| 2026-11-06 |
Synergy |
accepted |
Providers hand Synergy every word as a MessageRef whose key they name (D250, D201 revised); the Sneak Peek Link takes plain link and words props, and the host fetches and translates (D251). |
| 2026-11-06 |
Runtime Validations |
accepted |
Zod's customError makes every issue message a key; the API returns its own error shape (D252). |
| 2026-11-06 |
Hosting and Domains |
accepted |
The App on Vercel from apps/app with Skip deployment (D54 revised), the site on the Worker, the domains and the cutover, in one page; the Vercel page retires. |
| 2026-11-06 |
Shared tsconfig |
accepted |
apps/www keeps Astro's strict config, the one exception to the shared base (D50 revised). |
| 2026-11-05 |
Internationalization |
accepted |
English only but i18n-ready: next-intl in the App, use-intl on the site, catalogs colocated per package with shared words in @sidekick/i18n, logical CSS, an Arabic mock locale on test pages (D240 to D248); supersedes Centralized Copy (D36) when lesson I1 lands. |
| 2026-11-05 |
One Repo |
accepted |
Docs, writings and the site move into mehtapratik/sidekick with Arkive's history; the site runs on a Cloudflare Worker and moves to ossidekick.com, the App to app.ossidekick.com (D213 to D227). |
| 2026-11-01 |
Violations and Exceptions |
accepted |
violates (association) and exception-to (reference) join Synergy's starter vocabulary; unlinking resolves a violation and retyping it to exception-to waives it. |
| 2026-10-31 |
Tombstone Visibility |
accepted |
Synergy's soft-deleted rows (tombstones) stay visible to Synergy's own queries, and restoring one is allowed. |
| 2026-10-31 |
React as Peer Dependency |
accepted |
Packages that use React list it as a peer dependency, and each app that renders React (apps/app, and apps/www for its content components) installs it from the pnpm catalog (D58). |
| 2026-10-31 |
Content Sequence |
accepted |
The entity index keeps a content_seq counter that goes up on every write to an entity's content (D63). |
| 2026-10-30 |
Testing Layers |
accepted |
Tests run at four layers, and a behaviour is proven at the cheapest layer that can observe it (D60). |
| 2026-10-30 |
Synergy Store Choices |
accepted |
Four smaller choices about Synergy's store (Pratik, 2026-10-30), tightened after the design review (2026-10-31). |
| 2026-10-30 |
Platform Layer |
accepted |
A platform layer sits between features and the foundation: packages/platform/*, one package per shared service. |
| 2026-10-30 |
Mentions and Link Lifetime |
accepted |
Terms (Pratik, 2026-10-30): |
| 2026-10-30 |
Lexicon Highlighting |
accepted |
Lexicon highlighting (any feature's editor spots the first use of a term or alias and suggests a defined-by link) splits data from mechanism: |
| 2026-10-30 |
Capture External Content |
accepted |
Synergy versions only content that Sidekick holds. |
| 2026-10-30 |
Anchors in Content |
accepted |
A link can point at a passage of its target: a block, or some words inside one. |
| 2026-10-27 |
One Interface for Every Consumer |
accepted |
Every capability has one interface. |
| 2026-10-16 |
Stay on ESLint, Revisit Oxlint |
accepted |
What we chose: stay on ESLint. |
| 2026-10-16 |
ESLint Best Practice Rules |
accepted |
A curated set of widely used ESLint rules, each aimed at a class of bug, runs on top of the recommended presets; formatting stays with Prettier (D40). |
| 2026-10-14 |
Vitest |
accepted |
Vitest is the single unit and integration test framework for the whole monorepo (D59). |
| 2026-09-19 |
dotenv CLI |
accepted |
Sidekick to use dotenv-cli over Node.js --env-file flag to load environment variables. |
| 2026-09-19 |
Why Turborepo |
accepted |
|
| 2026-09-19 |
Why Prettier at Repo Level? |
accepted |
Prettier operates on files, not packages. |
| 2026-09-19 |
Vercel |
accepted |
|
| 2026-09-19 |
User Profile Creation by DB Trigger |
accepted |
Supabase auth API inserts a row into auth.users when user signs up. |
| 2026-09-19 |
Use Corepack |
accepted |
Use Corepack to setup package manager instead of installing pnpm manually. |
| 2026-09-19 |
TypeScript Hoisting |
accepted |
What we chose: TypeScript in root devDependencies (pnpm add -D -w typescript), hoisted to all packages. |
| 2026-09-19 |
Shared tsconfig |
accepted |
What we chose: A single tsconfig.base.json at the repo root that all packages extend. |
| 2026-09-19 |
Runtime Validations |
accepted |
TypeScript types are erased at runtime. |
| 2026-09-19 |
No Utility Styles |
accepted |
What we chose: CSS modules for all styling. |
| 2026-09-19 |
No API Versioning |
deferred |
Current API routes live at /api/ with no version prefix. |
| 2026-09-19 |
Module Resolution |
accepted |
What we chose: "moduleResolution": "bundler" in tsconfig.base.json. |
| 2026-09-19 |
GraphQL Relay |
deferred |
REST API for MVP. |
| 2026-09-19 |
Force Dynamic |
accepted |
Sidekick to add export const dynamic = 'force-dynamic' to the layout of every route group that touches Supabase. |
| 2026-09-19 |
Flat Config |
accepted |
Sidekick to have Eslint 9+ flat config format: eslint.config.js. |
| 2026-09-19 |
Env Vars in Turbo JSON |
accepted |
List all environment variables as env array of the build task of turbo.json. |
| 2026-09-19 |
Edge Runtime |
accepted |
Sidekick to have a dedicated createProxyClient(request, response) Supabase client for edge runtime. |
| 2026-09-19 |
ESLint Rules to Use tsup |
accepted |
What we chose: tsup to compile packages/eslint-plugin-sidekick instead of running tsc directly. |
| 2026-09-19 |
Centralized Copy |
accepted |
All user-visible strings such as labels, error messages, button text, and page titles live in packages/copy. |
| 2026-09-19 |
App Runtime Role for Drizzle |
accepted |
Runtime queries use the non-superuser app_runtime role, so the database itself enforces row-level security on every request (D35). |