ALICE · LEARN CHARLIEHUB

Mail Club · Camp Post the one where a laptop and a server learn to share a project

Reference · /learn/

ISSUE 04

Basecamp

Every issue so far has been about a site that already existed. This one’s different — it’s the start of an actual project, documented as I build it: a tool that has nothing to do with trip planning and everything to do with currency.

This first dispatch is scene-setting — no commands, nothing typed into a terminal yet. Just what the project is, why it’s framed the way it is, and why getting it running took two machines instead of one.

Where this is going: Part A (this page) is the concept — what the tool does and why two machines are involved at all. Part B walks Git and GitHub end to end: the actual setup, the password error everyone hits, and fixing it properly. Part C is Claude Code’s first real task on this project — including a mistake that got caught one command before it happened.

Currency-adjusted portfolio tool F1-themed sample data Two machines, one repo Git + GitHub
Stickers
  • the project
  • the lay of the land
  • the MacBook Air
  • the server, CT 2554
  • Git & GitHub
  • a milestone — held for Parts B & C

PART A — THE CONCEPT

01Part A

The question this tool answers

Your stocks went up. Your portfolio went down. Both of those can be true at once, and the reason has a name.

Start with the question a wealth manager actually gets asked: “why did my portfolio go down this quarter when my stocks went up?” The answer, most of the time, is currency. If you hold foreign assets, your return isn’t just what the asset did in its own market — it’s that, plus or minus whatever the currency did against your home currency while you were holding it.

This tool takes a multi-currency portfolio and splits its total return into two honest pieces: how much came from the assets themselves, and how much came from currency movement. That split — local return versus FX-driven return — is a real, standard concept in wealth management. It’s also exactly the kind of thing my UBS Treasury background is useful for explaining properly, rather than just knowing it exists.

Same skill as the day job. Different reason to build it.

Section Review Card

no. 01 of 05
Concept:
Total return splits into local return and FX-driven return.
Why me:
Treasury background, explained rather than just recognised.
One thing I actually understood today:
Badges:

02Part A

Why George Russell has a portfolio

The maths is identical either way. What changes is whether I still remember it a week later.

Raw portfolio data is dry. So the sample data isn’t random tickers — it’s built around George Russell, base currency GBP, five holdings chosen because they’re real sponsors and affiliations of his, not placeholders:

HoldingThe real-world linkTickerCurrency
Adidas AGMercedes team apparel partner (since 2025)ADS.DEEUR
Puma SEPersonal ambassador since 2022; Mercedes ended Puma’s team partnership in 2025PUM.DEEUR
Compagnie Financière RichemontParent of IWC SchaffhausenCFR.SWCHF
PVH CorpParent of Tommy HilfigerPVHUSD
Mercedes-Benz Group AGTeam affiliationMBG.DEEUR

The framing extends further than just the holdings — drivers as ‘clients,’ team principals as ‘portfolio managers,’ risk profile loosely tied to team performance. None of that changes the maths. What it changes is whether I actually remember any of it a week from now, instead of forgetting which ticker was which by Thursday.

From the trail log

Dear Camper,

This isn’t just decoration. A framing I actually enjoy is a real reason something gets finished instead of abandoned half-built — the same reason the trip scrapbook kept being fun to add to instead of turning into a chore.

— noted at basecamp

Section Review Card

no. 02 of 05
Concept:
Sample data chosen to be remembered, not to be neutral.
Base ccy:
GBP — five holdings across EUR, CHF and USD.
One thing I actually understood today:
Badges:

03Part A

A laptop, a server, and why both

A tent you carry with you, and a cabin that stays lit when you’ve gone home.

Two machines are involved in this project, doing different jobs, on purpose:

The MacBook Air is where the GitHub side of this first got set up — git installed, identity configured, the first commit made, the repo created and connected.

The server — CT 2554, the same box that hosts the trip scrapbook site — is where the actual work happens. This is where Claude Code lives and runs, and where the heavier lifting (data pulls, calculations, the eventual dashboard) will actually be built.

This isn’t accidental complexity. It’s the same shape as any real developer setup: a personal machine for quick edits and everyday use, and a separate, always-on machine for the work that needs to keep running or needs more horsepower. The two machines do talk to each other directly for one specific purpose — SSH, which is literally how the Mac reaches the server at all, including to run Claude Code. What they don’t do is sync the project’s code directly between each other. Git deliberately keeps that separate: no direct git-to-git exchange between machines, ever — every code change goes through GitHub instead, which is the one shared source of truth for the code itself.

EVERY CODE CHANGE GOES THROUGH THE MIDDLE MacBook Air git, identity, first commit GitHub the shared repo one copy of the truth Server · CT 2554 Claude Code, the heavy lifting PUSH PULL PUSH PULL SSH — DIRECT ACCESS CODE: NEVER SYNCED DIRECTLY — ALWAYS VIA GITHUB
SSH connects the two machines directly — that’s how the Mac reaches the server at all. The project’s code is different: neither machine ever syncs it straight to the other. Every code change travels through GitHub instead, in both directions.

Section Review Card

no. 03 of 05
Concept:
A personal machine and an always-on machine, doing different jobs.
The rule:
SSH connects them directly. Their code never goes direct — only through the middle.
One thing I actually understood today:
Badges:

04Part A

The shared source of truth

Two machines can only agree about a project if exactly one copy of it is allowed to be right.

Two machines editing the ‘same’ project only works if there’s an agreed single copy of the truth, and a disciplined way to update it. That’s what Git and GitHub split between them: Git tracks every change on whichever machine you’re using; GitHub holds the one online copy both machines sync against. ‘Sync’ here means two specific actions and nothing more — push sends your local changes up, pull brings down whatever changed elsewhere. There’s no automatic syncing, no background magic — every update is a deliberate action you take.

Two words, two things

Git and GitHub are often said in one breath but they’re not the same thing. Git would work perfectly well with no internet connection at all — it’s just a history-tracking tool for a folder. GitHub is the online home that makes two machines able to reach that history at all.

Section Review Card

no. 04 of 05
Concept:
One online copy is right; both machines sync against it.
Two verbs:
push sends up, pull brings down. Nothing is automatic.
One thing I actually understood today:
Badges:

05Part A

Choices already made, and why

Three decisions taken before any of it was built, each one for a stated reason.

Repo visibility

Private for now — can flip to public later once it’s further along and I’m happy with the state of it.

GitHub username

My real name, since I wanted it to obviously be mine rather than anonymous.

Data sources

yfinance and the Frankfurter API — both free, both keyless, so I didn’t have to deal with any paid tier or key management just to get moving.

End of the first dispatch

Everything above is decided. Nothing above has been typed into a terminal yet. That starts on the next page.

Section Review Card

no. 05 of 05
Concept:
Decide the boring things first, and write down why.
Keyless:
yfinance + Frankfurter — no key to manage, nothing to leak.
One thing I actually understood today:
Badges:
PART A 21 AUG 2026 PART A 21 AUG 2026

Dispatch postedPart A, cut and dated.