How Manor tracks upstream

Manor is a fork of elie222/rakazo. Upstream keeps moving; Manor keeps its own features and skin. The rule that keeps them from colliding: upstream flows into Manor through merges — Manor never rebases on top of it, and deployed history is never rewritten.

The actual history

Condensed to the milestones — each Manor node may cover several commits.

upstream/main (rakazo) main (Manor) sync merge points
%%{init: {
  "theme": "base",
  "gitGraph": { "mainBranchName": "upstream/main", "showCommitLabel": true, "parallelCommits": false },
  "themeVariables": {
    "darkMode": true,
    "background": "#1a1a1d",
    "primaryColor": "#232327",
    "primaryTextColor": "#ececee",
    "lineColor": "#4a4a52",
    "commitLabelColor": "#ececee",
    "commitLabelBackground": "#131315",
    "commitLabelFontSize": "12px",
    "tagLabelColor": "#0d0d0e",
    "tagLabelBackground": "#e65707",
    "tagLabelBorder": "#e65707",
    "git0": "#4a4a52",
    "git1": "#e65707",
    "git2": "#a855f7",
    "gitBranchLabel0": "#ececee",
    "gitBranchLabel1": "#0d0d0e",
    "gitBranchLabel2": "#0d0d0e"
  }
}}%%
gitGraph
  commit id: "#101 narration fix (fork point)"
  branch main
  checkout main
  commit id: "Manor skin & branding"
  commit id: "Claude Pro/Max OAuth ← our contribution"
  commit id: "Mobile app: Manor skin, TestFlight"
  checkout "upstream/main"
  commit id: "group chats"
  checkout main
  merge "upstream/main" id: "sync: adopt group chats" tag: "sync #1"
  commit id: "CRM: data + API"
  commit id: "CRM: home, pipeline, contacts"
  checkout "upstream/main"
  commit id: "#102 Supermemory · #144 connectors"
  commit id: "#137 charts · #95 thinking · #106 OAuth (ours, landed)"
  checkout main
  merge "upstream/main" id: "sync: approvals, charts, memory" tag: "sync #2"
  commit id: "Voice & call UX"
  commit id: "Mobile: CRM, keyboard, stream fixes"
  commit id: "4 Team Computer control fixes"
  checkout "upstream/main"
  commit id: "#147 conversational onboarding + MCP"
  commit id: "#150 CRLF · #152 reasoning · #156 E2E"
  checkout main
  merge "upstream/main" id: "sync: onboarding, MCP, connectors" tag: "sync #3 · today"
  commit id: "CRM agent tools: chat & voice work the board" type: HIGHLIGHT
    

The sync protocol, as a flow

The repeatable loop — the full playbook lives in docs/upstream-sync.md.

%%{init: { "theme": "base", "themeVariables": {
  "darkMode": true,
  "background": "#1a1a1d",
  "primaryColor": "#232327",
  "primaryTextColor": "#ececee",
  "primaryBorderColor": "#34343b",
  "lineColor": "#6e6975",
  "secondaryColor": "#1f1b29",
  "tertiaryColor": "#161619",
  "fontSize": "14px"
}}}%%
flowchart LR
  A["git fetch upstream"] --> B["What's new?
git log HEAD..upstream/main
git cherry spots backports"] B --> C["Preview conflicts
git merge-tree --write-tree
(touches nothing)"] C --> D["Branch
sync/upstream-<date>"] D --> E["Merge, never rebase
resolve by policy table"] E --> F["Verify locally
fix-signature greps · tests
typecheck · prisma validate"] F --> G["Land on main"] G --> H["Checkpoint with Aki,
then deploy to VPS"] style A fill:#232327,stroke:#34343b style H fill:#2a1608,stroke:#e65707,color:#ececee

Standing rules

Merge, never rebase

Rebasing rewrites deployed history and re-fights every conflict. Merging keeps both stories true and lets rerere remember each resolution.

Manor features live in Manor-owned files

New features get their own modules (like crm.ts, crm-tools.ts) with one-line touchpoints in upstream files — so the next sync conflicts on a line, not a feature.

Never sync and deploy in one step

Main only advances after local verification passes. Prod only advances after a checkpoint. Rollback is redeploying the previous commit.

Conflict policy, by category

Our contributions returning home → ours is canonical. Backport duplicates → take upstream. Manor identity (README, skin, onboarding look) → keep Manor, weave in upstream's logic. High-care files (router, schema) → hand-union.