Arkive

Synergy Lesson 0 Walkthrough: One Repo

As of
Version1.0.0
Kindguidance
Length3,039 words, about 13 min
Tagsbuildwalkthroughphase-3monorepoone-repogitcloudflare

This guide reproduces lesson 0 of Phase 3 step by step. Arkive's docs, writings and site move into the Sidekick repo with their full history, apps/web becomes apps/app, and arkive.blog is served by a Cloudflare Worker built from Sidekick's main. It implements the One Repo PRD (D213 to D217, D220, D221, D226) and the spec's One Repo section.

It shipped as sidekick#34 (the import, a merge commit), #35 (the rename), #38 and #39 (the content package and its guard), #43 (the site's type check), #44 (the Worker config) and #45 (security headers), then a hosting step in the Cloudflare dashboard. What was learned along the way is in the notes.

Every step explains what you are doing and why. Run everything from the Sidekick repo root unless a step says otherwise.


Step 0 — Freeze Arkive

What and why: Nothing may land in Arkive once its history has been copied, or the copy goes stale. Archiving makes the repo read-only, keeps every URL (old PR links included) and can be undone.

  1. Merge or close any open Arkive PR first. An archived repo can't merge anything, and only what's on main gets imported.
  2. Set the description before archiving, because an archived repo's settings are read-only too:
Shell
gh repo edit mehtapratik/arkive --description "Moved to mehtapratik/sidekick"
Shell
gh repo archive mehtapratik/arkive --yes
  1. Install the history-rewriting tool (it needs Git 2.36 or later):
Shell
brew install git-filter-repo

The old Cloudflare Pages project keeps serving its last deployment, so arkive.blog stays up until the hosting step.


PR 1 — The Import (the one merge commit)

Step 1 — Rewrite a throwaway clone

What and why: A commit is a snapshot of the whole tree plus its parent's hash, so moving files in the past means writing new commits with new hashes. That is done on a fresh clone, never on GitHub: the archived Arkive keeps its original hashes forever.

Shell
cd ~/Projects && git clone https://github.com/mehtapratik/arkive.git arkive-rewrite && cd arkive-rewrite
Shell
git filter-repo --to-subdirectory-filter apps/www --path-rename apps/www/sources/docs/:content/docs/ --path-rename apps/www/sources/writings/:content/writings/

--to-subdirectory-filter apps/www moves the root into apps/www/. The two --path-renames then run in order on those new paths. Files that only exist in old commits (design/, .idea/) stay under apps/www/ in history. filter-repo refuses to run on a clone that isn't fresh and removes the origin remote, so the rewrite can't be pushed over the real repo by accident.

Check it:

Shell
git ls-tree -d --name-only HEAD apps content
Shell
git log --oneline --follow -- content/docs/04-phases/living-plan.md

Step 2 — Merge the unrelated histories

What and why: The two repos share no commit, so there is no merge base. --allow-unrelated-histories merges against an empty tree. Step 1 made sure no path exists on both sides, so nothing conflicts. The merge commit has two parents, which keeps all of Arkive's commits reachable from main; a squash would flatten them into one.

Shell
cd ~/Projects/sidekick && git switch main && git pull && git switch -c chore/one-repo-import
Shell
git remote add arkive ../arkive-rewrite && git fetch arkive
Shell
git merge --allow-unrelated-histories --no-ff arkive/main

Message: chore: import Arkive's docs, writings and site with full history.

Shell
git remote remove arkive && git log --oneline --graph -4

Husky only has a pre-commit hook, and a merge without conflicts runs pre-merge-commit, so Prettier doesn't touch the 400 imported files here. The reformat gets its own commit in step 6.

Step 3 — Make the site a workspace package

What and why: pnpm-workspace.yaml already globs apps/*. The site needs Sidekick's package shape: one lockfile for the whole workspace, the @sidekick/ scope, Node 24.x like every package (engineStrict checks every engines field), and caret ranges that Renovate keeps current with no new rules.

Shell
git rm apps/www/package-lock.json

In apps/www/package.json: "name": "@sidekick/www", "engines": { "node": "24.x" }, "@astrojs/rss": "^4.0.19" and "unist-util-visit": "^5.1.0".

Then add the Astro Prettier plugin at the root:

Shell
pnpm add -D -w prettier-plugin-astro@^0.14.1 && pnpm install

Prettier 3 finds the nearest config by walking up from each file, but it loads the plugins that config names from the directory it runs in. lint-staged runs from the root, and pnpm installs a package only where it's declared, so a plugin installed only in apps/www makes every commit fail with Cannot find package 'prettier-plugin-astro'.

Shell
pnpm ls -r --depth -1

Commit: chore(www): make the site the @sidekick/www workspace package.

Step 4 — Point the site at content/

What and why: The site reads Markdown from the repo root now. Turbo hashes only files inside a package, so without an extra input a content edit would replay a stale build and skip the privacy and datum gates.

apps/www/src/lib/vault.mjs:

JavaScript
// pnpm, Turbo and Workers Builds run the site's scripts from apps/www, so the repo root is two levels up.
const REPO_ROOT = path.resolve(process.cwd(), '../..');
export const WRITINGS_DIR = path.join(REPO_ROOT, 'content/writings');
export const DOCS_DIR = path.join(REPO_ROOT, 'content/docs');

apps/www/src/lib/tree.ts: Astro stores each entry's filePath relative to the Astro project root, so it's now ../../content/docs/…:

TypeScript
const rel = e.source.filePath?.replace(
   /^\.\.\/\.\.\/content\/docs\/[^/]+\//,
   '',
);

turbo.json gets a task of its own for the site (PR 3 replaces it):

JSON
"@sidekick/www#build": {
   "dependsOn": ["^build"],
   "inputs": ["$TURBO_DEFAULT$", "$TURBO_ROOT$/content/**"],
   "outputs": ["dist/**"]
},

A package#task entry replaces the generic build entry for that package, so dependsOn and outputs are repeated.

Prove the cache, then the URLs:

Shell
pnpm turbo run build --filter=@sidekick/www --force && pnpm turbo run build --filter=@sidekick/www

The second run is FULL TURBO.

Shell
diff <(curl -s https://arkive.blog/sitemap.xml | grep -o '<loc>[^<]*' | sed 's|<loc>https://arkive.blog||' | sort) <(grep -o '<loc>[^<]*' apps/www/dist/sitemap.xml | sed 's|<loc>https://arkive.blog||' | sort)

It prints nothing. Commit: chore(www): read content from content/ and hash it into the site's build. Check the diff before committing: an editor's import sorter can move a file's header comment below an import, and staged files under content/ would still be reformatted by Prettier until step 5.

Step 5 — Inherit the root config

What and why: Git merges every .gitignore from the root down; Prettier uses only the nearest config and never merges. While apps/www/.prettierrc existed, the root config never applied to the site.

Shell
git rm apps/www/.gitignore apps/www/.prettierrc && pnpm remove --filter @sidekick/www prettier prettier-plugin-astro

Root .gitignore:

Code
# astro, obsidian and local agent settings
.astro/
.obsidian/
.claude/settings.local.json

Root .prettierrc.json gains:

JSON
"plugins": ["prettier-plugin-astro"],
"overrides": [{ "files": "*.astro", "options": { "parser": "astro" } }]

Root .prettierignore gains:

Code
# Obsidian writes the vault (D216)
content/

# The site ships these as given
apps/www/public/arkive.css
apps/www/public/arkive.js
apps/www/public/fonts/
apps/www/public/icons/
apps/www/src/shiki-themes.mjs

Commit: chore(www): inherit the root Prettier and Git config.

Step 6 — One format commit, skipped in blame

Shell
pnpm prettier --write apps/www && pnpm turbo run build --filter=@sidekick/www

Commit: style(www): format the site with the root Prettier config. Then add its hash to .git-blame-ignore-revs in a second commit (a commit can't contain its own hash), and point local blame at the file:

Code
# style(www): format the site with the root Prettier config
<git rev-parse HEAD of the format commit>
Shell
git config blame.ignoreRevsFile .git-blame-ignore-revs

Because PR 1 is merged with a merge commit, the format commit keeps this hash on main. Don't amend or rebase it afterwards.

Shell
git mv apps/www/CLAUDE.md apps/www/AGENTS.md && git rm apps/www/.claude/launch.json

Update apps/www/AGENTS.md for pnpm (pnpm --filter @sidekick/www dev, pnpm turbo run build --filter=@sidekick/www, pnpm --filter @sidekick/www preview), content/ paths and Node 24. Arkive hashes it quotes no longer exist in Sidekick: find the same commit by its message (c91121d became 28ec684).

Shell
ln -sfn content/docs/08-ai-coding-harness/agent-guide.md AGENTS.md && git rm docs scripts/setup-docs.mjs

Delete the docs:setup and postinstall scripts from the root package.json, then check the link resolves:

Shell
readlink AGENTS.md && head -3 AGENTS.md && pnpm install

Fold apps/www/CONTEXT.md into seven glossary pages in content/docs/07-glossary/ (sidekick, app, public-site, entry, writing, doc, about), each kind: glossary, id: glossary.<slug>, tags glossary and site, ending with its Avoid line, and publish: false so the sitemap stays unchanged. Delete CONTEXT.md and add D226 to the agent guide's "Always true".

Step 8 — Two licences

Shell
curl -fsSL https://creativecommons.org/licenses/by-nc/4.0/legalcode.txt -o content/LICENSE

The README gains a Licence section: code under MIT (LICENSE), writings and docs under CC BY-NC 4.0 (content/LICENSE), fonts under their own licences beside the files.

Step 9 — Fix the live docs the import made false

The README (no clone script, apps/www and content/ in the tree), the agent guide (content/docs/ paths, the same-PR rule), "docs PR" instead of "arkive PR" in the Synergy plan and the lesson 1 brief, content/docs/02-prd/ in the four later phase plans, and apps/www/AGENTS.md in Violations and exceptions. The Front Door hardening walkthrough gets a post note that setup-docs is gone. Finished walkthroughs keep their text.

Merge PR 1 with a merge commit

  1. Push. A push this size can fail over HTTPS with HTTP 400; raise the buffer for the repo and push again:
Shell
git config http.postBuffer 52428800 && git push -u origin chore/one-repo-import
  1. Turn merge commits on in both places, because main is squash-only in both: Settings → General → Pull Requests → Allow merge commits, and the "Prevent Direct Changes In Default Branch" ruleset's Allowed merge methods.
  2. Merge with a merge commit and a Conventional subject, then turn both settings back to squash only:
Shell
gh pr merge --merge --subject "chore: import Arkive's docs, writings and site with full history (#34)"
  1. Check: git log --oneline --graph -3 shows two parents, and git log --oneline --follow -- content/docs/04-phases/living-plan.md reaches Arkive's commits.

Post note (2026-11-08): #34 was squash-merged by mistake, which left one parent and no Arkive history on main. The tree was identical, so it was repaired by rebuilding the same merge commit on the squash's parent (git reset --hard f94c5ad, git merge --no-ff chore/one-repo-import), checking git diff 5846ebc HEAD was empty, and force-pushing once with --force-with-lease=main:5846ebc while the ruleset was disabled for a minute. main is now 8825103. Merging the branch again on top of the squash would not have worked: Git's history simplification follows the first parent whose files match, so log --follow and blame would still have stopped at the squash.

Done when: CI is green, git log --follow on a doc shows its Arkive commits, and the sitemap diff prints nothing.


PR 2 — Rename apps/web to apps/app

Shell
git switch -c refactor/rename-web-to-app && git mv apps/web apps/app
  • apps/app/package.json: "name": "@sidekick/app".
  • eslint.config.js: the apps/web/** globs and rootDir: 'apps/web' become apps/app. If one is missed, the Next.js and React Hooks rules silently stop applying while lint still passes.
  • .prettierignore, the no-barrel-exports comment and the README.
  • pnpm install (the lockfile keys packages by folder), then pnpm turbo run lint typecheck build test --force.
  • Live vault pages that name apps/web (a separate copy commit). Plans and walkthroughs of finished phases keep it.
  • Vercel → Settings → Build and Deployment → Root Directory: apps/app, before merging, then redeploy the PR's preview. The setting applies to every deployment.

Done when: CI and the Vercel preview are green and pnpm --filter @sidekick/app dev opens the App.


PR 3 — Content-only commits

content/ becomes @sidekick/content

content/package.json holds only four keys (D259):

JSON
{
   "name": "@sidekick/content",
   "version": "0.0.0",
   "private": true,
   "license": "CC-BY-NC-4.0"
}

pnpm-workspace.yaml lists 'content', apps/www/package.json depends on "@sidekick/content": "workspace:*", and the @sidekick/www#build entry leaves turbo.json. content has no build script, so Turbo makes it a transit node: it runs nothing, but its file hash feeds the site's build hash through ^build. Prove it without building:

Shell
echo >> content/writings/writings.margins.md && pnpm turbo run build --filter=@sidekick/www --dry | grep -A4 '^@sidekick/www#build'; git checkout content/writings/writings.margins.md

It shows Cached (Local) = false.

Label content-only PRs

Shell
gh label create content --color 0E8A16 --description "Every changed file is under content/"

.github/labeler.yml:

YAML
# A PR whose every changed file is under content/ is a content-only PR (D215)
content:
   - changed-files:
        - all-globs-to-all-files: 'content/**'

.github/workflows/labeler.yml:

YAML
name: Labeler

on:
   pull_request:

# Labelling writes to the PR, so unlike CI this job needs a write scope
permissions:
   contents: read
   pull-requests: write

jobs:
   label:
      runs-on: ubuntu-26.04
      timeout-minutes: 5
      steps:
         # Removes the label again when a later push adds a file outside content/
         - uses: actions/labeler@v7
           with:
              sync-labels: true

Creating the label by hand keeps the job to one scope: creating a missing label would also need issues: write.

Guard the folder's shape

scripts/check-content.mjs, at the repo root (inside content/ it would fail its own check):

JavaScript
// content/ holds content only (D259): Markdown and images under docs/ and
// writings/, plus LICENSE and a package.json with no code keys. It reads git's
// index, so the pre-commit hook checks exactly what is about to be committed.
import console from 'node:console';
import { execFileSync } from 'node:child_process';
import process from 'node:process';

const ROOT_FILES = new Set(['content/LICENSE', 'content/package.json']);
const CONTENT_FILE =
   /^content\/(docs|writings)\/.+\.(md|svg|png|jpe?g|gif|webp)$/;
const PACKAGE_KEYS = new Set(['name', 'version', 'private', 'license']);

const git = (...args) => execFileSync('git', args, { encoding: 'utf-8' });

const files = git('ls-files', '-z', 'content').split('\0').filter(Boolean);

const problems = (function () {
   const invalidFiles = files
      .filter((file) => !ROOT_FILES.has(file) && !CONTENT_FILE.test(file))
      .map((file) => `${file}: only Markdown and images belong in content/`);

   // `:path` is the staged copy, the same version as the file list above
   const manifest = JSON.parse(git('show', ':content/package.json'));
   const invalidKeys = Object.keys(manifest)
      .filter((key) => !PACKAGE_KEYS.has(key))
      .map((key) => `content/package.json: "${key}" is not allowed`);
   return [...invalidFiles, ...invalidKeys];
})();

if (problems.length > 0) {
   console.error(`check:content failed:\n  ${problems.join('\n  ')}`);
   process.exit(1);
}
console.log(`check:content ok: ${files.length} files.`);

Root package.json: "check:content": "node scripts/check-content.mjs". CI runs pnpm check:content after prettier:check, and .husky/pre-commit runs it after lint-staged. Prove the pass case first, then the failures:

Shell
pnpm check:content
Shell
echo "export {}" > content/index.ts && git add content/index.ts && pnpm check:content; git rm -q --cached content/index.ts && rm content/index.ts

Vercel skips content-only commits

Vercel → the App's project → Settings → Build and Deployment → Root Directory → "Skip deployments when there are no changes to the root directory or its dependencies". Vercel reads the same package graph: apps/app never depends on @sidekick/content.

Done when: a throwaway content-only PR gets the content label and Vercel reports "Skipped - Not affected", and a staged content/index.ts fails check:content. The first push of a new branch still builds; check a second content-only push on the same branch.


PR 4 — Type-check the site

Shell
pnpm add -D --filter @sidekick/www @astrojs/check typescript@^6.0.3 @types/node@^24.19.2

apps/www/package.json scripts: "typecheck": "astro check". The root pnpm typecheck runs turbo typecheck, so CI picks the site up with no workflow change. TypeScript is declared in the site because @astrojs/check needs it as a peer, and pnpm resolves peers from the package's own dependencies. @types/node is declared because the site imports node:fs and node:path itself.

Shell
pnpm --filter @sidekick/www typecheck && pnpm turbo run typecheck --force

Done when: CI's typecheck step shows @sidekick/www:typecheck with 0 errors.


PR 5 — Deploy the site on Workers

Shell
pnpm add -D --filter @sidekick/www wrangler

pnpm-workspace.yaml → allowBuilds: gains workerd: true. apps/www/wrangler.jsonc:

JSON
{
   "$schema": "node_modules/wrangler/config-schema.json",
   // The public site: static files only, no Worker script (D220)
   "name": "sidekick-www",
   "compatibility_date": "2026-11-10",
   "assets": {
      // What `astro build` writes; Workers Builds runs the build before deploying
      "directory": "./dist",
      // An unknown path gets dist/404.html with status 404
      "not_found_handling": "404-page",
   },
   // Each branch's Preview takes only what this block declares;
   // a static site needs nothing more, but the block must exist
   "previews": {},
}
Shell
git rm apps/www/scripts/cf-build.sh

The root .gitignore gains .wrangler/, and the site's AGENTS.md names the Workers Builds commands. Prove the config without deploying:

Shell
pnpm turbo run build --filter=@sidekick/www && pnpm -C apps/www exec wrangler deploy --dry-run

Keep the headers Pages added (#45)

Pages added two security headers by default; a Worker adds none. apps/www/public/_headers (a file, copied to dist/):

Code
/*
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin

Pages' third default, Access-Control-Allow-Origin: *, is left out on purpose: nothing reads the site's files from another origin.


Hosting — arkive.blog builds from Sidekick

Step 1 — Create the Worker from the repo

Workers & Pages → Create → Workers → Import a repository → mehtapratik/sidekick:

Setting Value
Project name sidekick-www (must match wrangler.jsonc)
Root directory /
Build command pnpm turbo run build --filter=@sidekick/www
Deploy command pnpm -C apps/www exec wrangler deploy
Previews Base (preview builds) on; preview command pnpm -C apps/www exec wrangler preview (replace the pre-filled npx wrangler preview), the same watch paths; save with Apply to existing Previews
Build watch paths (include) apps/www/*, content/*, pnpm-lock.yaml, package.json, pnpm-workspace.yaml, turbo.json
Environment variables none (Node comes from .nvmrc, pnpm from packageManager)

The first build deploys main to https://sidekick-www.<subdomain>.workers.dev; branches get <branch>-sidekick-www.<subdomain>.workers.dev.

Step 2 — Check the Worker before it gets the domain

Save arkive.blog's sitemap paths as the baseline, then compare the Worker:

Shell
W=https://sidekick-www.<subdomain>.workers.dev
diff <(curl -s https://arkive.blog/sitemap.xml | grep -o '<loc>[^<]*' | sed 's|<loc>https://arkive.blog||' | sort) <(curl -s $W/sitemap.xml | grep -o '<loc>[^<]*' | sed 's|<loc>https://arkive.blog||' | sort)
Shell
curl -s -o /dev/null -w "%{http_code}\n" $W/no-such-page/

The diff prints nothing, every sitemap path returns 200, the made-up path returns 404, and curl -sI $W/ shows the two headers from _headers. Also compare the response headers with arkive.blog's: that's how the missing Pages defaults were found.

Step 3 — Move the domains

  1. The old arkive Pages project → Custom domains → remove arkive.blog and www.arkive.blog. Downtime starts.
  2. The arkive.blog zone → DNS → delete any CNAMEs for those names that point to arkive.pages.dev.
  3. sidekick-www → Settings → Domains & Routes → Add → Custom domain: arkive.blog, then www.arkive.blog. Cloudflare creates the records and certificates. The Domains list shows no status badge; check with curl instead.
  4. The old project → Settings → Build → Automatic deployments: Disabled. Keep the project as the rollback until the cutover.

Exit check: arkive.blog and www.arkive.blog answer from the Worker (no charset on text/html, 307 for a missing trailing slash where Pages sent 308, the two _headers lines), the sitemap diff against the saved baseline is empty, all 242 paths return 200, and a made-up path returns 404.


After the lesson

  • Point Obsidian at ~/Projects/sidekick/content/docs, then delete ~/Projects/arkive (after moving its untracked design/ handover to the project's shared files if it isn't there) and ~/Projects/arkive-rewrite.
  • Follow-ups are in the backlog (B10, B12). Three more were cleared right after the lesson in #47: .npmrc deleted (pnpm 12 never read it), the General Sans and Sentient licences added next to the fonts (ITF Free Font License from each Fontshare download), and apps/www/.node-version deleted (the Workers build log shows nodejs@24.22.2 from the root .nvmrc, where the image default is 24.22.1).
Arkive

Index

Notes, decisions, and progress on my journey as I build Project Sidekick — built in the open; written as it happens.

Tags (145)

View

242 entries.

As ofTitleKind
2026-11-11Synergy Lesson 0 Walkthrough: One RepoReadingbuild walkthrough phase-3 monorepo one-repo git cloudflareguidance
2026-11-11Hosting and Domainssystem-design deployment vercel cloudflare domainspec
2026-11-11Synergy Lesson 0: One Repoplan phase-3 task monorepo one-repo git cloudflareplan
2026-11-11Synergy Checkpoint 3a: Prove the Store, Plan 3bplan phase-3 checkpoint guidanceplan
2026-11-11Synergy Lesson 1: Layer Folders and Lintplan phase-3 task monorepo eslintplan
2026-11-11Synergy - Feature Specificationsprd spec synergyprd
2026-11-11Agent Guideai-coding agent gateway agent-guidance rls supabase drizzle api react prettierguidance
2026-11-11Backlogged / Unplannedplan living-plan backlog feature-system taxila zinsser alter-ego parrot rls supabaseplan
2026-11-11Synergyplan living-plan phase-3 synergy rls postgresql api graphplan
2026-11-09Notesai-coding-harness agent-guidance nextjs eslint pnpm cssguidance
2026-11-08Synergy Lesson 4: Sandbox Providers and the First Routesplan phase-3 task synergy feature-system apiplan
2026-11-08Violations and Exceptionssystem-design synergyspec
2026-11-08Testing Layerssystem-design testing vitest playwrightspec
2026-11-08Best Practice Rulessystem-design code-quality-check eslintspec
2026-11-08Front Door: Hardening Walkthroughbuild walkthrough pre-2 rls supabase drizzle postgresql testing eslintguidance
2026-11-08Alter Egoplan living-plan phase-6 taxila zinsser alter-ego war-room factory core-driveplan
2026-11-08API Versioningsystem-design apispec
2026-11-08Approve Buildssystem-design monorepo nextjs pnpmspec
2026-11-08Best Practicesai-coding-harness agent-guidance drizzle api react pnpm css offline embedding soft-deleteguidance
2026-11-08Centralized Copysystem-design contentspec
2026-11-08dotenv CLIsystem-design config clispec
2026-11-08Installation at Workspace Levelsystem-design code-quality-check typescript pnpmspec
2026-11-08Pocketplan living-plan phase-8 taxila alter-ego nextjs vercel pwa mobileplan
2026-11-08Server Actionssystem-design nextjs rls api authenticationspec
2026-11-08Taxilaplan living-plan phase-4 taxila api-guard rls drizzle api authenticationplan
2026-11-08War Roomplan living-plan phase-7 war-room factory core-drive rls api offlineplan
2026-11-08With API Guardsystem-design security api-guard rls api authentication typescriptspec
2026-11-08Zinsserplan living-plan phase-5 taxila zinsser api mantine ai embeddingplan
2026-11-06Design Tokenssystem-design css design-systemspec
2026-11-06Native UIsystem-design css design-system mantinespec
2026-11-06Public Site: System Designsystem-design site one-repospec
2026-11-06Internationalizationsystem-design content i18nspec
2026-11-06Decisions Logdecisionlog
2026-11-06Synergy: System Designsystem-design synergyspec
2026-11-06CSS Modulessystem-design css eslint stylelintspec
2026-11-06Dependency Flowsystem-design monorepo clispec
2026-11-06ESLint Plugin Boundariessystem-design code-quality-check eslintspec
2026-11-06Non-Syncable Tablessystem-design database offlinespec
2026-11-06Prettier at Repo Levelsystem-design code-quality-check prettierspec
2026-11-06Runtime Validationssystem-design typescriptspec
2026-11-06Shared tsconfigsystem-design code-quality-check typescriptspec
2026-11-06Syncable Tablessystem-design database offline soft-deletespec
2026-11-06Technology Stacksystem-design supabase drizzle postgresql nextjs typescript turborepo pnpm vercelspec
2026-11-06Architectural OverviewSidekick's architectural overview — an API-first platform tuned for solo developerssidekick project technical architecturedocument
2026-11-05One Repoprd feature synergy one-repoprd
2026-11-05Overview of Synergyprd feature synergyprd
2026-11-03Commands and Environmentai-coding command environment agent-guidance prettier pnpm cliguidance
2026-11-01Synergy Lesson 10: Save Call, Anchorsplan phase-3 task synergy apiplan
2026-11-01Synergy Lesson 11: Delete and Restoreplan phase-3 task synergy databaseplan
2026-11-01Synergy Lesson 12: Tagsplan phase-3 task synergy apiplan
2026-11-01Synergy Lesson 13: Race Testsplan phase-3 task synergy testing postgresqlplan
2026-11-01Synergy Lesson 2: Per-Package Migrationsplan phase-3 task database drizzle testingplan
2026-11-01Synergy Lesson 3: Entity Index and Version Logplan phase-3 task synergy database rls postgresqlplan
2026-11-01Synergy Lesson 5: Outbox, Status and Versionsplan phase-3 task synergy database postgresqlplan
2026-11-01Synergy Lesson 6: Links, Relation Types and Cyclesplan phase-3 task synergy graph postgresql apiplan
2026-11-01Synergy Lesson 7: Staleness Dots and the Roll-Upplan phase-3 task synergy apiplan
2026-11-01Synergy Lesson 8: Lists and Supersedeplan phase-3 task synergy graph postgresqlplan
2026-11-01Synergy Lesson 9: Save Call, Mentionsplan phase-3 task synergy apiplan
2026-11-01Content Sequencesystem-design synergyspec
2026-11-01Tombstone Visibilitysystem-design synergy rlsspec
2026-11-01Anchors in Contentsystem-design synergy anchorsspec
2026-11-01Capture External Contentsystem-design synergy taxilaspec
2026-11-01Lexicon Highlightingsystem-design synergy taxilaspec
2026-11-01Mentions and Link Lifetimesystem-design synergyspec
2026-11-01Synergy Store Choicessystem-design synergy postgresqlspec
2026-11-01Relationshipsprd feature synergyprd
2026-11-01Scope and Phasesprd feature synergyprd
2026-11-01Stay on ESLint, Revisit Oxlintsystem-design eslint typescriptspec
2026-11-01App Runtime for Drizzlesystem-design database drizzle postgresqlspec
2026-11-01Corepacksystem-design monorepo pnpmspec
2026-11-01Edge Runtimesystem-design security supabasespec
2026-11-01Env Vars in Turbo JSONsystem-design monorepo turborepo vercelspec
2026-11-01Flat Configsystem-design code-quality-check eslintspec
2026-11-01Force Dynamicsystem-design nextjs supabasespec
2026-11-01GraphQL and Relaysystem-design api graphql relayspec
2026-11-01Living Implementation Planplan living-plan taxila zinsser alter-ego war-room factory parrot core-driveplan
2026-11-01Module Resolution: Bundlersystem-design code-quality-check typescriptspec
2026-11-01Profile Creation Postgres Triggersystem-design security postgresql api authenticationspec
2026-11-01Public API Onlysystem-design api rls authentication clispec
2026-11-01tsupsystem-design code-quality-check eslintspec
2026-11-01Turboreposystem-design monorepo turborepo pnpmspec
2026-10-31Build mind palaceprd value-proposition specificationprd
2026-10-31Exponential Evolutionprd value-proposition specificationprd
2026-10-31Remember everythingprd value-proposition specificationprd
2026-10-31Entities and the Entity Indexprd feature synergyprd
2026-10-31Foundationsprd feature synergyprd
2026-10-31Keeping Links Trueprd feature synergyprd
2026-10-31Sneak Peek Linkprd feature synergyprd
2026-10-30Search and Backlinksprd feature synergyprd
2026-10-30Tagsprd feature synergyprd
2026-10-29Cost to Add Laterprinciple product engineeringguidance
2026-10-27Individual Firstprinciple productguidance
2026-10-27One Interfaceprinciple api cliguidance
2026-10-24Gatekeeper Lesson 7 Walkthrough: The Ops Package and Entitlements Grantbuild walkthrough phase-2 feature-system database postgresql cliguidance
2026-10-24Gatekeeper Lesson 8: Close-Outplan phase-2 task guidanceplan
2026-10-24Gatekeeper Walkthroughbuild walkthrough phase-2 api-guard feature-system rls authenticationguidance
2026-10-24Gatekeeper Lesson 3 Walkthrough: Entitlementsbuild walkthrough phase-2 feature-system database drizzle rls postgresql testingguidance
2026-10-24Gatekeeper Lesson 4 Walkthrough: withApiGuardbuild walkthrough phase-2 api-guard rls api authentication testingguidance
2026-10-24Gatekeeper Lesson 5 Walkthrough: Request and Auth-Failure Loggingbuild walkthrough phase-2 api-guard observability eslint testingguidance
2026-10-24Gatekeeper Lesson 6 Walkthrough: /api/health and Guard Verificationbuild walkthrough phase-2 api-guard api nextjs testingguidance
2026-10-24Gatekeeper Lesson 2 Walkthrough: resolveApiCallerbuild walkthrough phase-2 api-guard authentication supabase testingguidance
2026-10-24Gatekeeper Build Rules and Target Designplan phase-2 api-guard rls api authentication typescript guidanceplan
2026-10-24Gatekeeper Lesson 1 Walkthrough: Feature Registrybuild walkthrough phase-2 feature-system typescript monorepo testingguidance
2026-10-24Gatekeeper Lesson 7 (Task 2.10): Dev Entitlement Seed Scriptplan phase-2 task feature-system database postgresqlplan
2026-10-24Gatekeeperplan living-plan phase-2 api-guard rls api authentication feature-systemplan
2026-10-24Terminalplan living-plan phase-9 taxila api-guard rls api authentication cliplan
2026-10-23Gatekeeper Lesson 3 (Tasks 2.8, 2.9): Entitlements Table and getEnabledFeaturesplan phase-2 task feature-system database drizzle rls postgresql testingplan
2026-10-23Gatekeeper Lesson 4 (Tasks 2.2, 2.3): withApiGuard With withRLSplan phase-2 task api-guard rls api security testingplan
2026-10-23Gatekeeper Lesson 5 (Tasks 2.4, 2.5): Request and Auth-Failure Loggingplan phase-2 task api-guard observability eslintplan
2026-10-23Gatekeeper Lesson 6 (Tasks 2.11, 2.12): /api/health and Guard Verificationplan phase-2 task api-guard api nextjs testingplan
2026-10-23Centralizedsystem-design observability api authenticationspec
2026-10-23Database and Securityai-coding database security agent-guidance api-guard rls drizzle api react repository-patternguidance
2026-10-23Error Handlingsystem-design observability api-guard rls supabase api nextjs react aispec
2026-10-23Front Door: Row-Level Security Walkthroughplan phase-1.1 rls database supabase drizzle postgresql api typescriptguidance
2026-10-23Groundwork Checkpoint B Walkthroughbuild walkthrough phase-0 checkpointguidance
2026-10-20Gatekeeper Lesson 2 (Task 2.1): resolveApiCallerplan phase-2 task api-guard authentication supabase nextjsplan
2026-10-18Gatekeeper Lesson 1 (Tasks 2.6, 2.7): FeatureManifest and ALL_FEATURESplan phase-2 task feature-system typescript monorepoplan
2026-10-18Registrysystem-design feature-systemspec
2026-10-17Core Drive to Be Practical and Grounded in Realitysystem-design feature core-drive prdprd
2026-10-17MVP Scopeprd mvp specification core-drive taxila war-room factory alter-ego zinsser parrot api cli native-appprd
2026-10-17An AI Writing Coach and an Appsystem-design prd feature zinsser aiprd
2026-10-17Overview of Taxilasystem-design prd feature taxila ragprd
2026-10-16Front Door: Hardeningplan pre-2 foundation security database testingplan
2026-10-14Profiles Schemasystem-design security rls authenticationspec
2026-10-14Tag Taxonomyai-coding agent-guidance taxonomy discoveryguidance
2026-10-13Anatomy of a Core Drive Entrysystem-design prd feature core-driveprd
2026-10-13Core Drive Stores Personal and Sensitive Informationsystem-design prd feature core-drive taxila graphprd
2026-10-13Core Drive Stores Values Onlysystem-design prd feature core-drive war-room factoryprd
2026-10-13Core Drive to Foster Reflections and Learningssystem-design prd feature core-driveprd
2026-10-13Groundwork: Checkpointsplan phase-0 api nextjs typescript eslint turborepo pnpmplan
2026-10-13Model Routingprd vercel ai embedding routingprd
2026-10-13Overview of Core Drivesystem-design prd feature core-drive factory ai alter-egoprd
2026-10-13Source Attributionprd feature alter-ego aiprd
2026-10-12Command Paletteprd ux specificationprd
2026-10-12MVP Design Objectiveprd ux specificationprd
2026-10-12Be the Best Version of Yourselfprd value-proposition specificationprd
2026-10-12Make the Right Behavior Easierprd value-proposition specificationprd
2026-10-11Solve Problems and Build Thingsmotivation creativityjournal
2026-10-11A Personal Discoverymotivation discipline bucket-list ambition entrepreneurship sidekickjournal
2026-10-11Commercialize Sidekickmotivation finance freedomjournal
2026-10-10Realityprinciple reality pragmatism survivalguidance
2026-10-10Seek Closureprinciple productivity happiness purposeguidance
2026-10-08No Do-Oversprinciple core-drive execution productivityguidance
2026-10-08Pragmatismprinciple practical pragmaticguidance
2026-10-04Protect Your Mind and Your Timeprinciple productivity automation minimalismguidance
2026-10-03Focus Funnelprinciple core-drive productivityguidance
2026-10-02Fuel Career Growthmotivation career ambitionjournal
2026-10-02Learnmotivation learning ai ragjournal
2026-09-19Actual Stateglossary terminologyglossary
2026-09-19Algorithm of Lifeglossary terminology nextjsglossary
2026-09-19Alter Egosystem-design prd feature taxila alter-ego factory aiprd
2026-09-19API Firstsystem-design api clispec
2026-09-19Architectural Driverssystem-design offlinespec
2026-09-19Architecture Invariantsai-coding architecture invariant agent-guidance api nextjsguidance
2026-09-19Asynchronoussystem-design rag embeddingspec
2026-09-19Atomicsystem-design rag embeddingspec
2026-09-19Authenticationsystem-design security taxila api authentication pwa mobile clispec
2026-09-19Background Jobssystem-design vercel background-jobspec
2026-09-19Build for Today, Designed for Futuresystem-design offlinespec
2026-09-19Bundle Everythingsystem-design monorepospec
2026-09-19Capacitorsystem-design native-app nextjs mobile offlinespec
2026-09-19Centralizedsystem-design feature-systemspec
2026-09-19Centralized and Client-Agnosticsystem-design security rls api authentication clispec
2026-09-19CLIsystem-design cli apispec
2026-09-19Context Assemblersystem-design ai war-room factory api-guardspec
2026-09-19Coresystem-design feature-systemspec
2026-09-19Core Drive and Taxilasystem-design prd feature taxila core-driveprd
2026-09-19Driving Forces and Key Featuressystem-design api offlinespec
2026-09-19Embedding Status Fieldsystem-design rag embedding typescriptspec
2026-09-19Enforced Conventionssystem-designspec
2026-09-19Essential and Ideal Stateglossary terminologyglossary
2026-09-19Evolvabilitysystem-design rls offlinespec
2026-09-19Factorysystem-design prd feature factoryprd
2026-09-19Feature Package Workai-coding feature monorepo agent-guidance feature-systemguidance
2026-09-19Front Doorplan living-plan phase-1 api-guard rls supabase drizzle postgresql apiplan
2026-09-19Front Door Task 1.1plan phase-1 task supabase postgresql api authentication nextjsplan
2026-09-19Front Door Task 1.10plan phase-1 task rls supabase drizzle postgresql authentication typescriptplan
2026-09-19Front Door Task 1.11plan phase-1 task api-guard rls supabase api authentication nextjsplan
2026-09-19Front Door Task 1.14plan phase-1 task react pnpm mantine cssplan
2026-09-19Front Door Task 1.17plan phase-1 task supabase authenticationplan
2026-09-19Front Door Task 1.18plan phase-1 task api-guard rls supabase drizzle postgresql authenticationplan
2026-09-19Front Door Task 1.2plan phase-1 task supabase drizzle postgresql authentication nextjs pnpmplan
2026-09-19Front Door Task 1.3plan phase-1 task supabase nextjs typescriptplan
2026-09-19Front Door Task 1.4plan phase-1 task supabase authentication nextjs react typescriptplan
2026-09-19Front Door Task 1.5plan phase-1 task rls supabase authentication typescriptplan
2026-09-19Front Door Task 1.6plan phase-1 task rls supabase drizzle authentication typescript offlineplan
2026-09-19Front Door Task 1.7plan phase-1 task drizzle postgresql typescriptplan
2026-09-19Front Door Task 1.8plan phase-1 task turborepo pnpmplan
2026-09-19Front Door Task 1.9plan phase-1 task rls supabase drizzle postgresql authenticationplan
2026-09-19Front Door Tasks 1.12 and 1.13plan phase-1 task supabase api authentication nextjs react typescriptplan
2026-09-19Front Door Tasks 1.15 and 1.16plan phase-1 task supabase authentication nextjs react mantineplan
2026-09-19Front Door: Original Planplan phase-1 rls supabase drizzle postgresql authentication nextjsguidance
2026-09-19Front Door: Row-Level Securityplan living-plan phase-1.1 rls supabase drizzle postgresql pnpm soft-deleteplan
2026-09-19Groundworkplan living-plan phase-0 nextjs typescript eslint prettier turborepo pnpmplan
2026-09-19Groundwork Checkpoint Aplan phase-0 checkpoint nextjs typescript turborepo pnpm cliplan
2026-09-19Groundwork Checkpoint Bplan phase-0 checkpoint eslint prettier turborepo pnpmplan
2026-09-19Groundwork Checkpoint Cplan phase-0 checkpoint nextjs pnpmplan
2026-09-19Groundwork Checkpoint Dplan phase-0 checkpoint api-guard rls supabase drizzle api authenticationplan
2026-09-19Historic Stateglossary terminologyglossary
2026-09-19Idempotent APIsystem-design api idempotencyspec
2026-09-19Independent Deploymentssystem-design feature-systemspec
2026-09-19Informationglossary terminologyglossary
2026-09-19Instrumentationsystem-design observability vercel embeddingspec
2026-09-19Isolationsystem-design feature-systemspec
2026-09-19Lifecycle and Traceabilityprd governance planningguidance
2026-09-19Many Clients and Many Consumerssystem-design api pwa ai rag clispec
2026-09-19May Become Part of Taxilasystem-design core-drive taxilaspec
2026-09-19Middlewaresystem-design security api authenticationspec
2026-09-19Migrationsystem-design database drizzle pnpmspec
2026-09-19Model Router Contractsystem-design ai model-routing provider-agnostic embeddingspec
2026-09-19Never Mutate Outside API Layersystem-design apispec
2026-09-19Observabilitysystem-design api-guard api authentication vercel observabilityspec
2026-09-19Observablesystem-design rag embedding observabilityspec
2026-09-19Offline Readysystem-design api pwa offline soft-delete idempotencyspec
2026-09-19Open Houseplan living-plan phase-11plan
2026-09-19Parrotsystem-design prd feature parrotprd
2026-09-19Prefer JSON Configsystem-design monorepospec
2026-09-19Present Stateglossary terminologyglossary
2026-09-19Productivity Modulesystem-design prd feature war-roomprd
2026-09-19PWAsystem-design pwa offlinespec
2026-09-19RAGsystem-design rag ai embeddingspec
2026-09-19Repository Clientsystem-design database rls supabase drizzle api repository-patternspec
2026-09-19Request Flowsystem-design monorepo api offlinespec
2026-09-19Retryablesystem-design rag embeddingspec
2026-09-19Row-Level Securitysystem-design security rls drizzle offlinespec
2026-09-19Soft-Delete Supportsystem-design database soft-deletespec
2026-09-19Start Todayprinciple core-drive execution consistencyguidance
2026-09-19State Representationsystem-design api aispec
2026-09-19Storefrontplan living-plan phase-12 api offlineplan
2026-09-19Structured Response Attributionsystem-design ai structured-streaming source-attribution citationspec
2026-09-19System Overview Diagramsystem-designspec
2026-09-19Tiered Context Modelsystem-design core-drive domain situation war-room factory ai embeddingspec
2026-09-19Tiptap Requirementsystem-design rag embeddingspec
2026-09-19Use Navigation Hooksystem-design nextjsspec
2026-09-19Watchtowerplan living-plan phase-10 api-guard rls api authentication nextjs offlineplan
2026-07-19Project Sidekick - A Bird’s Eye ViewAn introduction to Project Sidekick. What is it? What problem does it solve? Why am I building it?sidekick project essaydocument
2026-07-10Building in the Margins of RealityProject kick-off post and a confessional essay about my past attempts and their failures. Why start now? What do I hope to achieve?sidekick project essayjournal
2026-05-29Config Files Explainedbuild walkthrough phase-0 turborepo typescript eslint prettierguidance
2026-05-29Front Door: Original Walkthroughbuild walkthrough phase-1 supabase drizzle authenticationguidance
2026-05-29Groundwork Checkpoint A Walkthroughbuild walkthrough phase-0 checkpointguidance
2026-05-29Groundwork Checkpoint C Walkthroughbuild walkthrough phase-0 checkpointguidance
2026-05-29Groundwork Checkpoint D Walkthroughbuild walkthrough phase-0 checkpointguidance