type: decision
status: active
timestamp: 2026-06-24
tags: [layout, monorepo, submodules, workspace, hierarchy, branding]

Workspace layout: repos/<owner>/<own|forks>/<bucket>/<category>/<repo>

5-level hierarchy: owner, own/forks, 4 buckets, category, repo

Workspace layout: owner ? own/forks ? bucket ? category ? repo

Decision

The oriz-org/workspace umbrella organizes all 74 submodules in a 5-level path hierarchy. Top level partitions by GitHub owner, so oriz-org/* repos and chirag127/* repos sit side-by-side on disk. Second level partitions own/ (we authored) from forks/ (we forked). Third level groups by artifact type (Shape B, 4 buckets). Fourth level is the existing category folder. Fifth is the repo slug itself.

Folder names use short forms (decided 2026-06-24 to keep paths typeable):

FolderShortWhat
chirag127/c127/Personal account owner
oriz-org/oriz/Brand org owner
products/prod/User-facing artifacts
services/svc/Server-side runtimes
libraries/lib/Reusable published code
browser-extensions/bs-ext/Browser extensions
ide-extensions/ide-ext/VS Code / IDE extensions
mcp-servers/mcp/MCP servers
npm-packages/npm/npm packages
apis/api/HTTP APIs
content/, apps/, books/, data/, rules/, skills/, clis/, workers/, forks/, own/, hub/, tools/, personal/unchangedAlready short enough
repos/
+-- oriz/                              ? owner (oriz-org on GitHub)
¦   +-- own/                           ? we authored
¦   ¦   +-- prod/                      ? products: user-facing artifacts
¦   ¦   ¦   +-- apps/                  ? Astro / SvelteKit / etc. sites
¦   ¦   ¦   ¦   +-- content/<repo>/    ? (existing sub-bucket inside apps)
¦   ¦   ¦   ¦   +-- hub/<repo>/
¦   ¦   ¦   ¦   +-- personal/<repo>/
¦   ¦   ¦   ¦   +-- tools/<repo>/
¦   ¦   ¦   +-- bs-ext/<repo>/         ? browser extensions
¦   ¦   ¦   +-- ide-ext/<repo>/        ? VS Code / IDE extensions
¦   ¦   ¦   +-- clis/<repo>/           ? renamed from py-pkg-cli/
¦   ¦   +-- svc/                       ? services: server-side runtimes
¦   ¦   ¦   +-- api/<repo>/            ? HTTP APIs (CF Workers)
¦   ¦   ¦   +-- workers/<repo>/        ? non-API workers
¦   ¦   ¦   +-- mcp/<repo>/            ? MCP servers
¦   ¦   +-- lib/                       ? libraries: reusable published code
¦   ¦   ¦   +-- npm/<repo>/            ? npm packages
¦   ¦   +-- content/                   ? non-runnable assets
¦   ¦       +-- books/<repo>/
¦   ¦       +-- rules/<repo>/
¦   ¦       +-- skills/<repo>/
¦   ¦       +-- data/<repo>/
¦   +-- frk/                              ? forks maintained for the brand
¦       +-- {prod,svc,lib,content}/<category>/<repo>/
+-- c127/                              ? owner: chirag127 personal account
    +-- own/                           ? personal projects (cs-me-app, etc.)
    ¦   +-- {prod,svc,lib,content}/<category>/<repo>/
    +-- frk/                           ? drive-by forks (most forks land here)
        +-- {prod,svc,lib,content}/<category>/<repo>/

Concrete example: the cs-me-app submodule lives at repos/c127/own/prod/apps/personal/cs-me-app/.

Why two top-level owner folders

Every submodule’s GitHub owner is either oriz-org or chirag127. Putting that in the on-disk path makes the owner unambiguous without opening .gitmodules. It also lets git grep, find-in-files, and CI matrices scope by owner trivially.

The brand-owned repos cluster under oriz-org/. Personal experiments and drive-by forks cluster under chirag127/. Recruiter strategy (see rules/recruiter-strategy): chirag127 stays populated so the personal account doesn’t look dead.

Why 4 buckets (products / services / libraries / content)

Shape B grouping chosen over Shape A (flat 12 categories). The 4 buckets are the standard industry partition:

If a new category arrives (e.g. mobile apps), it slots into one of these 4 buckets without rethinking the hierarchy.

Why fork hierarchy mirrors own hierarchy

Forks get the same {products,services,libraries,content}/<category>/ sub-structure as own/ so the layout is symmetric and a fork’s on-disk path matches its own/ sibling’s pattern. A fork of an Astro app sits at forks/products/apps/<bucket>/<repo>/, never at the root of forks/.

Renames in this migration

What this replaces

What this does NOT change

Migration cost


Edit on GitHub · Back to index