Seafile Retirement — Scrub & Relocation (design)
Status: Design complete, walked section-by-section with Brad 2026-06-18 and approved.
Next step is /planning → seafile-retirement-plan.md (shares this stem). Dateless while
active per the design/plan suffix convention.
One-line: Seafile is retired (client already uninstalled). Scrub every live Seafile
reference from the docs/utilities/settings across all three repos, repoint paths to new flat
homes under C:\Projects\, then physically relocate the repos and re-wire ~/.claude/ via a
handoff script Brad runs outside the session, with a self-check as the verification gate.
Understanding summary
- What: A single coordinated "de-Seafiling" — scrub Seafile references, repoint all
absolute paths, physically relocate the three repos to flat
C:\Projects\peers (claude-personal,yggdrasil,odin-codin), re-wire~/.claude/, and migrate per-project memory so everything keeps working. - Why: Seafile retired — no active benefit on a consistent single machine, more upkeep
friction than it was worth. Already uninstalled, so the files at
C:\Seafile\Claude\are inert. - Who/where: Brad, single Windows machine, staying local. No multi-machine concern.
- Constraints / success criteria: after the change —
~/.claude/resolves (skills, commands,CLAUDE.md); the registered hooks still fire (script paths repointed); per-project memory and session continuity preserved; and no live doc, utility, or setting points atC:\Seafile\…or describes Seafile as the sync mechanism. - Key technical constraint: this work is authored from a session running inside
C:\Seafile\Claude\yggdrasil. A live session can't cleanly move the directory it runs in, so the physical move + re-wire is a scripted handoff Brad runs after the session closes, not executed mid-session.
Non-goals (explicit)
- NOT the cloud move. Relocating the whole environment onto a dedicated always-on host (the
eventual destination, with Kingdom.md as the visibility window) stays deferred behind Kingdom.md.
working/host-relocation-design.mdremains the live thread for it. - NOT GitHub remotes today. Pushing the three repos to private remotes is the planned backup replacement but is a near-term follow-up right after this work, not part of it. A brief single-copy-local interim is accepted.
- NOT the AGENTS.md/CLAUDE.md restructuring or the Odin-Codin'→Yggdrasil fold — separate post-Seafile threads (bookmarked 2026-06-18).
- NOT any Windows→Linux/Bash conversion — that belongs to the cloud move.
- NOT rewriting historical/dated records (dated
current-plan.mdcheckpoints,archive/*) — they keep their Seafile mentions as accurate history.
Assumptions
- Uninstalling the Seafile client is done (Brad, 2026-06-18). Scope is the repos, the
~/.claude/wiring, the physical move, and memory migration. - The "personal layer" concept/term stays; only the directory renames to
claude-personal. relink.ps1is the re-wiring mechanism: update its base paths, then re-run (idempotent) to rebuild the junctions/symlinks at the new location.- The hook scripts (
bell.ps1,webfetch-github-guard.ps1) don't hardcode their own paths (confirmed: no Seafile hits inside them); only their registration insettings.jsonneeds repointing. - The per-project memory dir (
…\projects\C--Seafile-Claude-yggdrasil\) orphans when cwd changes (Claude Code re-derives the folder name from the path); migrating it is in scope. - Nothing external to these repos hardcodes
C:\Seafile\…(Brad confirmed — no other scripts/scheduled-tasks/IDE configs/shortcuts).
The design
End state
Three repos at C:\Projects\claude-personal, C:\Projects\yggdrasil, C:\Projects\odin-codin;
~/.claude/ re-wired to those homes; hooks firing from C:\Projects\claude-personal\hooks\;
per-project memory preserved at its new hash path; no live artifact referencing C:\Seafile\…
or Seafile-as-sync. host-relocation-design.md survives as the live cloud thread.
C:\Seafile\Claude\ left on disk (inert) for Brad to delete by hand once verified.
Phase A — in-session edits (git-tracked; done now while files are still at C:\Seafile)
claude-personal repo (the personal repo; renamed at move time):
skills/new-machine-setup/relink.ps1—$lib = 'C:\Seafile\Claude'→'C:\Projects';$repos'personal'→'claude-personal'; the two literalpersonal\…paths (CLAUDE.md symlink ~L76, repo-settings ~L83) →claude-personal\…. Update the header comment (drops "Seafile library"). Optional robustness: harden broken-reparse-point handling so a stale junction whose target moved is removed before re-creation — though the relocation script's pre-clean (D9) makes this non-critical for the move itself.skills/new-machine-setup/SKILL.md— the portability rewrite: from "install Seafile client + sync library" to "get the three repos onto the machine (GitHub clone later / thumb-drive copy / manual paste), placed atC:\Projects\{claude-personal,yggdrasil,odin-codin}, then runrelink.ps1." Drop the "Seafile Details" section; repoint allC:\Seafile\…paths; reword the "doesn't ride Seafile sync" lines (settings/plugins are machine-local for other reasons); update the frontmatterdescription+ triggers (drop "Seafile symlinks"); fix the "Standard File Structure" footer.skills/new-machine-setup/evals/evals.json— the 3 eval prompts + expected-outputs are Seafile-framed; rewrite to the portable framing.claude-config/README.md— repoint hook paths; reword the "all paths underC:\Seafile\Claude\library root → machine-independent" framing; dereference Seafile generally.claude-config/settings.json(snapshot) — hook command paths →C:/Projects/claude-personal/hooks/…; drop the now-deadRead(//C/Seafile/Claude/**)allow (covered by the existingRead(//C/Projects/**)).CLAUDE.md— Machine Setup rewrite: "Standard paths," the "Seafile sync" section, and "Layered configuration" lose Seafile-as-sync and describe the flatC:\Projects\layout (three sibling repos, no library root). Keep the still-true conventions (mklink/Dev Mode, line-endings, settings hand-management — reworded to drop Seafile framing). Reconcile the "commit convention" line that currently endorses a "Co-Authored-By trailer" → state the rule below. Add the co-author convention (promoted from memory)..gitignore— reword the "Seafile library" comment.
yggdrasil repo:
AGENTS.md:162— "symlinked from the Seafile library root" → new framing.README.md:121— "cloned toC:\Seafile\Claude\yggdrasil\" →C:\Projects\yggdrasil\.skills/bookmarking/SKILL.md:36—bookmarks.mdpath → new.commands/scry.md:60— example.puppetpath → new..claude/settings.json:5-6—.puppetWrite/Edit perms →C:/Projects/yggdrasil/.puppet/**.bookmarks.md— reconcile Seafile-referencing entries: L20 (drain its doc-scrub portion as done-by-this-work; keep the cloud-relocation remainder pointing athost-relocation-design.md), L15 (repoint example path), light notes on L35/L36 (the worktree-remove race was blamed on Seafile scanning the tree — with Seafile gone, note it may no longer recur). Also fix the pre-existing newline mash between the 2026-06-09 and 2026-06-11 entries.- NEW
CLAUDE.md(repo root) — minimal, carrying just the omit-Co-Author convention. Auto-loads when cwd is yggdrasil (the portability insurance). Seed of the future AGENTS.md→CLAUDE.md migration (bookmarked). working/host-relocation-design.md— light touch only (note the viewer = Kingdom.md and the single-machine interim); the design otherwise stays live.
odin-codin repo: no edits (no Seafile references) — it only moves.
memory (…\projects\C--Seafile-Claude-yggdrasil\memory\):
- Keep
git-commit-from-powershell.md(machine-specific PowerShell fact; revisit at the Ubuntu move). - Delete
omit-claude-coauthor-trailer.md(now dual-homed inCLAUDE.mdfiles). - Update
MEMORY.mdindex accordingly.
Library root (not in any repo): seafile-ignore.txt — no action; vanishes when Brad deletes
the old folder.
The commit-trailer convention (resolved)
Omit the Co-Authored-By trailer by default, always — including no Co-Authored-By: Claude.
Add a trailer only when Brad explicitly asks in the moment. This goes into personal CLAUDE.md
(global) and the new yggdrasil/CLAUDE.md (ships with the repo, auto-loads in-repo even when
the personal layer isn't wired). Redundant by design — portability insurance.
Memory triage rationale
CLAUDE.md auto-loads (host/OS-independent: Claude Desktop and a future Ubuntu terminal share the
same engine and loading rules); AGENTS.md does not auto-load in Claude Code (only via
@-import or explicit read). So the convention's reliable home is a CLAUDE.md, not AGENTS.md.
The git-commit fact is genuinely machine-specific (PowerShell here-strings vs -F) and stays in
per-machine memory. The memory dir migrates regardless, because that fact stays.
Phase B — the handoff machinery (Brad runs after the session closes)
Two PowerShell scripts, living + run from C:\Install\Claude (Brad's scratch dir; outside the
moving repos so they survive the move). Copies committed into the repo for the record.
relocate-claude.ps1 — idempotent, with a -DryRun mode (prints every planned action,
touches nothing). Ordered steps:
- Preflight (abort with a clear message on any failure): all three source dirs present (or
detect a partial/re-run);
C:\Projectsexists; no registered git worktrees in any repo (they break on move); working trees committed. - Move the three dirs →
C:\Projects\{claude-personal,yggdrasil,odin-codin}(skip any already at target — idempotent). - Migrate memory — copy (not move)
~/.claude/projects/C--Seafile-Claude-*→C--Projects-*(mappingpersonal→claude-personal), leaving originals as rollback until the old folder is deleted. - Pre-clean
~/.claudelinks — delete theskills/+commands/link-dirs and theCLAUDE.mdlink wholesale (clean slate; sidesteps broken-junction edge cases). - Repoint live
~/.claude/settings.json— surgically swap the two hook command paths toC:/Projects/claude-personal/hooks/…; leave everything else (incl. GitKraken) untouched. - Run the updated
relink.ps1from its new home → rebuilds theCLAUDE.mdsymlink + per-skill junctions + per-command symlinks fresh, all pointing atC:\Projects. - Invoke the self-check and print its report.
self-check-claude.ps1 — independently runnable; PASS/FAIL per assertion:
- The three targets exist and are git repos; the three
C:\Seafilesources are gone. ~/.claude/CLAUDE.mdresolves toC:\Projects\claude-personal\CLAUDE.mdand reads.- Every
~/.claude/skills/*junction andcommands/*symlink targetsC:\Projects\*— zero still pointing atC:\Seafile; counts sane. - Live
settings.jsonhook paths point atC:\Projects\claude-personal\hooks\and those.ps1files exist. - Memory dir present at the new
C--Projects-yggdrasilpath. - A residual-reference grep finds no lingering
C:\Seafilepath in operational files (scripts,settings.json, skill/command instructions, configs) — proving the scrub held. Deliberately excluded (they reference Seafile by topic, not as a live path): the two design docs (seafile-retirement-design.md,host-relocation-design.md),archive/*and datedcurrent-plan.mdcheckpoints, and the retirement-narrating bookmark entries. The check is about stray hardcoded paths, not prose about the retirement.
Caveat: relocate-claude.ps1 can't be live-tested in the authoring session (it moves the dir
we're in). Per Yggdrasil's "verify-by-walkthrough / first-real-use" pattern, the scripts are
verified by structural review + the dry-run; the self-check is the real gate on Brad's run.
Choreography (end-to-end order)
Phase A (this session): (1) all git-tracked edits above; (2) author both scripts, drop copies
in C:\Install\Claude, commit copies into the repo; (3) commit each touched repo (claude-personal
- yggdrasil; odin-codin untouched, just moves).
Boundary — /save-progress: (4) pin the checkpoint and dispose this session's worktree
(merge to main) before the move — a registered worktree breaks when its parent repo relocates.
Then close the session.
Phase B (Brad runs from C:\Install\Claude, session closed): (5) relocate-claude.ps1 -DryRun
→ eyeball; (6) relocate-claude.ps1 → move + migrate memory + repoint settings + pre-clean/relink +
auto-run self-check; (7) open a fresh session at C:\Projects\yggdrasil, confirm all-PASS; (8)
delete the inert C:\Seafile\Claude\ by hand once satisfied.
Post-move follow-ups (separate): GitHub private remotes (deferred backup); optional general
/hygiene-check bookmark-curation pass; then the future threads (Odin-fold, AGENTS.md repurpose).
Decision log
- D1 Scope = scrub + relocate now; cloud move stays deferred (
host-relocation-design.mdlives on). Alt considered: pursue the full cloud relocation now — rejected, gated behind Kingdom.md; or pure doc-scrub with no move — rejected, Brad wants the repos out of the Seafile-named folder. - D2 Target = flat
C:\Projects\peers;personal→claude-personal. Alt:C:\Projects\Claude\(preserve grouping) orC:\Claude\— Brad chose flat;claude-personalresolves the "personal as a top-level entry reads oddly" wrinkle. - D3 Backup via GitHub remotes deferred to a near-term follow-up; brief single-copy-local gap accepted. Alt: set up remotes now (rejected — keep today scoped) / other interim backup (Brad: thumb-drive copy is enough optionality for now).
- D4 Approach 1: one idempotent
relocatescript (+-DryRun) + a separateself-check. Alt: guided manual steps + small helpers (rejected — more hands-on, missable steps); defer all to a fresh post-move session (rejected — wastes hot-context editable work). - D5 Old
C:\Seafile\Claude\left intact for manual deletion (rollback path); the script does not auto-delete it. - D6 Memory: git-commit fact stays in memory (machine-specific); co-author convention
dual-homed (personal
CLAUDE.md+ newyggdrasil/CLAUDE.md), removed from memory; memory dir migrated regardless. - D7 Commit trailer: omit
Co-Authored-Byby default, always; add only on explicit request. - D8 Yggdrasil convention home = minimal
yggdrasil/CLAUDE.md(auto-loads), notAGENTS.md(Claude Code doesn't auto-load AGENTS.md — verified against code.claude.com/docs). Broader AGENTS.md repurpose + convention migration deferred (bookmarked 2026-06-18). - D9 Post-move broken-junction risk handled by pre-cleaning
~/.claudelinks, then relinking fresh — chosen over trusting in-place repair of stale reparse points. - D10 Session worktree disposed (merged to
main) before the physical move. - D11 Scripts live/run from
C:\Install\Claude; copies committed for the record.
Related bookmarks (captured 2026-06-18, separate efforts)
- Fold Odin Codin' into Yggdrasil (after Seafile retirement).
- Repurpose
AGENTS.mdas external-facing + migrate internal conventions to auto-loadingCLAUDE.md+ update/good-morning(the newyggdrasil/CLAUDE.mdis this thread's seed).
Handoff
Ready for /planning → working/seafile-retirement-plan.md. The plan should sequence Phase A
(per-repo edit tasks with verifiable outcomes), the two scripts as build-and-structurally-verify
tasks, and Phase B as the documented handoff + self-check gate.