My Office
English · Tiếng Việt
A 3D office where your Claude Code sessions come to work. Each session is a character at a desk:
- it walks to the library to read files;
- it types at its desk while it edits;
- it goes to the server room to run commands;
- it launches a rocket when you deploy.
!My Office: the company floor with sessions at work
Try it before you install anything. The demo has made-up projects and needs no Claude Code: run npm run dev and
open .github/workflows/pages.yml).
Questions or ideas? Ask in Discussions → Q&A, suggest something in Ideas, or show your office in Show and tell.
My Office is a community project. It is not made by, endorsed by or affiliated with Anthropic.
Quick start
You need Node.js 20.9 or newer and Claude Code, on macOS, Linux or Windows. The machine panel (RAM, CPU, disk, dev servers, cleanup) reads each system its own way; opening a session's IDE window and quitting apps are macOS only.
npm install -g claude-my-office # (the command it installs is my-office)
my-office install --service # adds the hooks to ~/.claude/settings.json and runs the office at login
my-office doctor # checks Node, the server, every hook and the background service
Then open npx claude-my-office start (the hooks still need
npx claude-my-office install). An npm install keeps its data (settings, the phone PIN, the history vault) in ~/.my-office,
so upgrading (npm install -g claude-my-office@latest) keeps it.
From the source instead (to change the code):
git clone https://github.com/khanh020905/my-office.git && cd my-office
npm install
node bin/cli.mjs install --service # the same commands as my-office …, its data in data/
installbacks upsettings.jsonbefore changing it and only adds My Office's own hooks. Running it again adds
- To remove everything:
my-office uninstall(from the source:node bin/cli.mjs uninstall).
install [--service] [--lan] [--no-approve] [--no-status] [--no-otel] [--no-otel-names] | Adds three kinds of hooks: event hooks, approval hooks, and a status line that reports your plan's usage. Your own status line keeps running inside it. It also turns on Claude Code's own usage numbers (OpenTelemetry) for "What eats your plan", unless you already send them somewhere: see below. --service runs the office in the background from login: launchd on macOS, a systemd user service on Linux, the Startup folder on Windows (no admin needed). --lan lets a phone on the same Wi-Fi watch. --no-approve leaves out the approval hooks. --no-status leaves your status line alone. --no-otel leaves telemetry off; --no-otel-names keeps the names of your own MCP servers, skills and agents hidden ("custom"). |
| uninstall | Removes every My Office hook, the telemetry settings install added, and the background service, and keeps the rest of settings.json. |
| doctor | Checks each step and says what is missing and how to fix it. |
| start [--lan] | Runs the server in this terminal (no launchd). |
| pin [--new] | Shows the phone PIN; --new changes it and signs every phone out. |
- Restart after changing the code:
launchctl kickstart -k gui/$(id -u)/com.my-office(macOS) or
systemctl --user restart my-office (Linux). my-office doctor prints the right command for your system.
- Logs:
tail -f ~/.my-office/server.log(from the source:data/server.log).
What's inside
The office
- Three floor plans (Settings → Office):
- You are the director. Every prompt you send is carried to the right desk. When the work is done, the person
- Subagents come in through the door and get their brief from their boss. They work where their task belongs,
- Resting sessions lean back with a pillow and a blanket after a while. Click a sleeping one and it tells you what
- People react to you:
- Late at night, sessions that have been resting for half an hour put their coats on and go home by the lift. They
- The lift after a restart (company floor): for the first three minutes after the office's server starts (five when
?liftservice, or ?liftservice=new, shows it.)
- Out of Claude: when an account's plan limit (the 5 hours or the week) is used up, the people on that account leave
?limitout=30 shows it for half an hour.)
- Games on the lounge TV (company floor): a 55" TV on a media unit, a console beside it, two controllers. Now
- Pool in the lounge (company floor): a 7-foot table with walnut rails, pearl diamonds and leather pockets, the
- The karaoke box (company floor, beside the phone booth): a soundproof cabin like the coin-op ones in Vietnamese
- The week's rhythm: Monday 9:00 the bell rings for the stand-up by itself and everyone free goes round the meeting
- Staff who aren't sessions: on the company floor a receptionist sits at the lobby reception from 7:45 to 18:15,
- Project areas: each project (its git repository) has its own desks: on the company floor half a pod (the two
- The Thần Tài – Thổ Địa altar (company floor): a red-lacquered shrine on the floor by the reception, facing the
?lunar=1 to see
it any day).
- Lunch from home at the microwaves (company floor): about a third of the office brings rice from home (more than half
?comnha to see it now).
- Daily duty rota (trực nhật, company floor): a whiteboard on the pantry wall names today's four chores and who does
?duty to see every chore now).
- Quarterly fire drill (diễn tập PCCC, company floor): on the first working day of each quarter HR pins the notice
?drill for one now).
- Make-up Saturdays and swapped days off (làm bù, nghỉ bù): the office keeps Vietnam's official calendar, its public
src/shared/workdays.js, how to add a year in its comment). On a make-up
Saturday the office works as on any weekday: the receptionist at the front desk, lunch from home and the quán cơm,
the duty rota; in the morning someone grumbles in the group chat ("Thứ Bảy mà vẫn phải lên công ty 😩 làm bù mà").
The day swapped off is a day off (the front desk shut, no lunch, no rota, no Monday stand-up), as are weekends and
holidays; on the last afternoon before a break of three days or more someone says how long it is, and which Saturday
to come back on. As announced up to now: Saturday 10/1/2026 for Friday 2/1, Saturday 22/8/2026 for Monday 31/8; none
for 2027 (the Government chose Tết 4/2–10/2 and Quốc khánh 2/9–5/9 without one).
- Farewells (tiệc chia tay): a project that really was at work (on two days or more) and has had no session for 30
data/tenure.json (on its first run it reads, once, only the dates and folders
of Claude Code's transcripts).
- Interns made permanent: a project new to the office (unknown to it and to Claude Code before this came in, so
- The midday nap, 12:30–13:30: the blinds come down, the room dims a little, and whoever has nothing running naps
- The look of the place:
?wedding for any day);
- street trades: two or three xe ôm men wait on their scooters at a corner (6:30–19:30) and sleep on them at the midday
nap, feet on the handlebar and hats over their faces; someone naps in a hammock between two park trees. From 5:30 to
8:30 a woman sells xôi from her baskets beside a steaming bánh cuốn pot: people on their way in eat standing, sit
for a plate, or buy from their scooter at the kerb. By day a barber works under a mirror nailed to a tree, next to a
vá xe corner with tyres, a compressor and a scooter up on its stand;
- concrete poles with sagging bundles of power cables along the streets, coils of spare cable and a transformer box.
Now and then an ambulance (115) or a fire engine (114) comes through with lights flashing and siren sounding;
traffic pulls over to let it by (?siren to see one);
- the traffic police (CSGT), as they work today: now and then two officers in the yellow uniform ride by on white
patrol bikes (C.S.G.T / TRAFFIC POLICE, lights flashing). Some mornings and late afternoons they set up a
checkpoint on the office's pavement just after a crossing: the bikes up on the pavement, a sign, cones along the
kerb, one officer at the lane's edge with the baton, the other by the bikes (reflective vests after dark). They stop a
rider without a helmet, three on a scooter, one on the phone or one through the red light: a whistle, the scooter
pulls in, the officer salutes, says why, checks the licence and registration on VNeID, writes the record and the
rider signs. Some evenings (more on Fridays and Saturdays) it is an alcohol check: anyone may be asked to blow, and a
high reading means the scooter is held and the rider walks. The chip over the checkpoint opens a card with the
steps (Circular 73/2024/TT-BCA), the fine range and clause (Decree 168/2024/NĐ-CP, article 7) and the record itself,
a pretend one with made-up names and plates. In first person, E by them does the same (?csgt to see one);
- a quán nhậu (a street-side beer place) on the park's edge across the street, 16:30–23:00: low blue plastic tables,
red and blue stools, an ice chest and crates of beer (a made-up "BIA", no real brand), peanuts, grilled dried
squid, snails and a hotpot steaming on its burner, a charcoal grill smoking with the owner fanning it, a waiter going
to and fro, a hand-painted sign and a string of bulbs after dark; the regulars raise their glasses now and then
("Một, hai, ba, dô!"), more of them on Fridays and Saturdays. On Fridays at about 18:30 (and one evening in four on
other weekdays) a few people from the office who are resting go down for a few rounds: an invitation in the group
chat, the long table by the kerb, a clink each round and cheeks a little redder each time; work coming in calls one
back up. Nobody rides home after a drink: "Đã uống rượu bia thì không lái xe" in the chat, a GrabBike, a Xanh SM bike
or taxi to the kerb, and the scooter stays in the row till the morning. On the alcohol checkpoint's evenings the
police stand on the quán's street, and a regular who rides off on his own scooter is stopped and breath-tested. The
quán's chip opens its menu (illustrative prices) and who from the office is at the table; in first person, E to sit
down with them (?nhau to see it any time);
- a pickleball court by a park, at its real size (20 × 44 ft, the kitchen 7 ft each side of the net, the net 34 in in
the middle and 36 in at the posts), blue on green, chain-link fence and windscreens, LED floodlights in the evening,
"200.000–300.000đ/giờ sau 17h" on the board at the gate; the neighbourhood plays doubles on weekday evenings and
weekend mornings and evenings, in visors, tennis skirts and court shoes. On a day the CI has stayed green someone asks
"Tối nay kèo pick không?" in the group chat at five, and at half past four people resting go down to play (a fifth
films it); a test run while they play is a point, each passing test a shot over the net and the first failing one
into the net. After an hour the clip goes into the chat with everyone's share of the court (70k). In first person,
E at the gate (?pickle to see the court in use);
- a Korean-style self photo studio across the street: a pink container, "Chụp ảnh Hàn Quốc" in pink neon, two booths
behind their curtains (feet showing under them), a basket of props (cat-ear headbands, giant heart sunglasses, party
hats), the price board (a 4-frame strip 70k, the big print 100k), young people coming in the evening and queueing at
the weekend. A release (a new version tag in a session's repository, or a GitHub release) sends four people resting
there: four frames, four silly poses with the props, the flash; the strip goes into the group chat and they come back
up still wearing the props and pin it on the whiteboard, the version under it: the six newest stay, a release history.
At the weekend they are back nearly two hours later. In first person, E at the door for a strip of your own;
- half the scooters in the row outside the office are electric (the smooth shape of Vietnam's 2026 e-scooters, an LED
headlight across the apron, a hub motor, no exhaust), each with a five-bar battery gauge that follows this
computer's battery (pmset on macOS, /sys on Linux; hidden where there is none, as on Windows), filling bar by
bar while it charges. Under 20%, the owner of the emptiest one rides it to the battery-swap cabinet on a park's
corner (V-Green's kind: lockers with their status lights, the screen and the QR code), takes out the empty pack,
scans, puts it in, takes a charged 1.5 kWh one (two or three minutes, 9.000đ) and rides back with it full. In Hà
Nội, the sign of the low emission zone inside Ring Road 1 (from 1 July 2026) stands at a corner near the office;
- traffic lights have Vietnam's countdown boxes beside them, red or green digits counting down the light. On a hot
sunny day (33 °C+, from the real weather) scooters wait at a red light back in a street tree's shade instead of at
the stop line;
- riders as you see them on Vietnamese streets: on sunny days many women in floral "ninja" sun suits with sunglasses
and a wrap skirt; now and then a scooter carries a fridge, a ladder, a gas cylinder, a potted tree, a chicken cage or
a stack of styrofoam boxes taller than the rider. On the lunar 1st and 15th, in front of small family shops, someone
burns votive paper in a steel drum by an offering table (?lunar=1 to see it any day);
- going out (city backdrop): before lunch on the company floor a GrabFood rider stops at the kerb and someone resting goes
down in the lift for the team's lunch; now and then someone resting pops down to the convenience store across the
street, waits for the green man, and comes back with a drink; on a really hot afternoon (the city's real weather,
32° and up) the trip is for a 10k cone at the Mixue, and when CI goes green again someone goes for ice cream for
everyone. The day's first one in stops at the Highlands for a cà phê on the way up, and when Claude Code on this
computer updates (its editor extension, looked at every few minutes) someone runs to Thế Giới Di Động to "lên đời"
and the group chat hears the new version. Work coming in calls them back at a run;
- day and night by the clock;
- real weather, if you pick a city;
- seasonal decorations (Halloween, Christmas, Lunar New Year).
- Walk in: explore the office in first person (WASD to move, E to use what is in front of you). Walk up to someone
- A short tour on the first visit points at what you can click (the lamp, the switch, the coffee machine, the
- A 15-second clip (in photo mode): a video of the office from morning to evening, square for a feed or vertical
- Photo mode (P): hide every panel, turn the camera any way you like, and save a PNG up to 4K with the names
Your work, live
- Desk screens show what each session is doing: the editor, a terminal, a browser, a chat, a permission dialog.
- Git:
- The whiteboard lists each session's task and progress, plus your own sticky notes.
- The team chat (top bar), drawn like a group chat on a Vietnamese messenger: people post about what really
data/chat.json) and seen by your phones too. Written to "The whole group" it is just chatting; pick a
conversation in To over the input and Claude itself answers (below).
- Timeline and replay: one lane per session; replay the last hour or day at up to ×120; export it as a video.
- Weekly recap: a picture card of your week with Claude, ready to save or paste into a post. It shows the hours,
- A trophy cabinet for milestones: 1,000 prompts, 10,000 edits, the first deploy, and more.
Approve from the office
- Permission requests show up as cards: Allow, Always allow, Deny. Keys Y, N and A answer the top card.
- Risky commands are marked red, need two clicks and never offer "Always allow". That covers recursive deletes,
curl | sh, sudo, and anything mentioning prod.
- Claude's questions and plans are cards too, with every option, a free-text answer, and "approve" or "keep
- When this applies: only while the page is open and visible, and for at most 45 seconds. Otherwise Claude Code
- Stuck loops get broken: when a session runs the same thing and gets the same error three times in a row, its
PreToolUse hook that answers from memory;
it gives up after 0.3 s, so with the office closed or busy the call simply goes ahead). The person's name tag turns
red with "stuck", the team chat gets a card ("api-worker ran npm test and got the same error 3 times: try 4
blocked") with Stop (at its next step; a run started from the office is stopped outright) and Send a hint
(Claude reads it with its next step; once its turn is over, the hint carries the conversation on), and your phone
gets a notification. It also points out compaction after compaction and spending for 10 minutes with no file edited,
without blocking anything. Anything you type to the session forgives it. Settings → More: on or off, after how many
failures, after how many minutes. Older installs: run my-office install once more to add the hook.
- Two sessions on one file, a port someone holds: when a session is about to edit a file another session edited in
EADDRINUSE, "Port 3000 is in use"), the
chat says which server holds it and whose it is, and that session's Claude is told not to kill it. Both go through
the stuck-loop hook, so they need nothing more installed.
- Pinned notes that survive compaction: a session's drawer has a Pinned tab for what that conversation should
SessionStart hook, source compact), and the team chat says so. Kept by conversation in
data/pins.json, 12 at most. Older installs: run my-office install once more to add the hook.
- Calls auto mode refused: when auto mode refuses a call (Claude Code's
PermissionDeniedhook), the team chat gets a
my-office install once more to add the hook.
- Undo the last turn: a resting session's drawer has ↶ Undo last turn: the files Claude changed with its file
data/undo/. You see each file and what will happen first, two clicks to do it, then Tell Claude. From a phone
only when work from phones is allowed.
- "Fix it" when CI goes red: when the latest CI run of a repository a session works in fails (read with
gh), the
Your plan and your Mac
- The plan pill shows your closest usage limit (5 hours, weekly, per model) and warns at 80% and 95%. With a second
CLAUDE_CONFIG_DIR, such as ~/.claude-org2), that account's limits
show too, and its sessions wear a small badge with the account's name.
- Several Claude accounts: "Add a Claude account" in the plan card makes the account's folder and signs it in from
claudeCode.claudeProcessWrapper, set
and removed by the office) or a shell alias the card shows; the accounts share history, settings and memory by links
to ~/.claude. macOS and Linux.
- Moving an open session to another account: click its person, then "Change account" and pick one. A session in
- Models: coordinator and subagents (Settings → More): the model a Claude session runs on (Opus, Sonnet or the
CLAUDE_CODE_SUBAGENT_MODEL_FORCE). "Ask Claude to split big tasks among subagents" adds a short note to
~/.claude/CLAUDE.md, taken out again when off. Written to ~/.claude/settings.json (model,
env.CLAUDE_CODE_SUBAGENT_MODEL); the other accounts share it by a link. Sessions started from then on use it.
- My Office in the Mac's menu bar:
installalso builds a small menu bar app (the building icon by the clock; it
--no-menubar leaves it out.
- My Office in the editor's side bar:
installalso adds a small panel to each editor on the computer (Antigravity,
/panel
(no 3D), so it costs next to nothing; --no-panel leaves the editors alone, uninstall takes it out.
- Codex and Antigravity accounts too: the plan card has a tab for each beside Claude's (as the phone window's two ways
codex app-server);
"Add a Codex account" opens the ChatGPT sign-in page without signing the current one out; "Use" puts that account's
sign-in into ~/.codex/auth.json (the one there saved first: Codex rotates refresh tokens). A codex started after
that uses it; the Codex panel in an editor keeps the old one until you reload the window, and the card says so.
Antigravity IDE: each account with its quota per model family (the model picked in the agent panel first), as
the IDE saved it in its state database (read with sqlite3, read-only). The IDE reads its account only as it starts,
so with it open a switch waits for a quiet moment: when you close it, or while you are away (10 minutes without a key
or the mouse, or a locked screen) with no Claude session in it at work and its own agent idle, the office closes and
reopens it behind the app you had in front, every window, tab, unsaved file and Claude conversation back as it was
(on a Mac; OFFICE_AG_AWAY_MIN sets the minutes). You can also have it done now. Adding one takes the IDE's sign-in
out (kept, not signed out) and opens it to sign in again. With "Switch by itself when one runs out" on, both move to
the next account with room; Antigravity already at 90% used, so the switch is done before you run out. The sign-ins
stay in the office's own data folder (data/codex, data/antigravity, readable by you only). OFFICE_AI_ACCOUNTS=0
turns both off.
- The Mac pill opens RAM, swap, CPU and disk. It says why the Mac is slow (memory spilled to disk, who holds the
- Forgotten work (in the Mac panel): every git worktree and main checkout of the repositories your sessions worked
.claude/worktrees too) that still holds files not committed, commits not pushed or a stash, with
its branch, size and when it last changed. Open it in your editor or terminal, Give it to Claude (a new
conversation in that folder, the words ready to change), or Delete a worktree with nothing left in it, after a
confirmation: never the main checkout, never one with work in it or a session open, and git (no --force) checks
again right before.
- Each session has a context bar and a waste bin that fills up with context. It also shows its cost at API prices:
- The cache clock: a cup of coffee on each resting desk whose steam fades as the session's prompt cache cools, gone
prompt_cache (Claude Code 2.1.251 or later) and a resumed
session's SessionStart; without them it is a guess from the end of the last turn and the documented lifetime (an
hour on a subscription, five minutes on an API key), marked "(estimated)". Settings → More can tell your phone when
a session waiting for your answer is five minutes from going cold (off by default).
- What eats your plan (the line at the bottom of the plan card, or ••• in the group chat, also on a phone): where
/v1/metrics, /v1/logs, OTLP/HTTP JSON) and kept as daily sums in data/otel/ for 30 days. install adds them
to the env of ~/.claude/settings.json, tagged MY_OFFICE_OTEL so uninstall takes out exactly those keys, and
never if you already send telemetry somewhere (settings, your shell or a managed policy): it prints how to add the
office as a second exporter to your OpenTelemetry Collector instead. Prompts stay hidden (OTEL_LOG_USER_PROMPTS is
not set); OTEL_LOG_TOOL_DETAILS=1 gives the real names of your own MCP servers and skills, and the tool input it
adds to the events is dropped unread. A new Claude Code session picks the settings up; open ones keep their old ones.
Small things
- English or Vietnamese (Settings → Display).
- Graphics: Auto, Low, Medium or High. Auto steps down by itself when frames come late, and remembers it per device.
- Streamer mode blurs commands, paths and chat for recording.
- 2D view (3D | 2D in the top bar, or
?view=2d): no 3D, just the sessions as rows, quiet on purpose. Approvals
/) finds
one by name, project or branch. Each row: the conversation, its project and branch (or the task it was given), what
it is doing now in words of the work, its checklist, context, time and cost, with its subagents under it; a click
opens it. Kept per browser. It saves battery and works without WebGL.
- Open on your phone: same Wi-Fi, or anywhere through the Cloudflare tunnel (below), 6-digit PIN. Watching, plus
/rc) works too: the
session's QR code in its drawer opens that conversation in the Claude app.
- To, over the chat's input: pick a conversation and write (or speak): that very conversation carries on. Resting in
- Prompt helper, over the chat's input when you write to Claude: worked out in the page (nothing is sent), it points
- Notifications on your phone (Web Push, from
server/push.mjswith nothing butnode:crypto; shown by
public/sw.js): Claude's answers, and an approval a phone's work needs while no office page is open, even with the
phone locked. Turned on on each phone (⚙ → More → 📱) over the https address; on an iPhone, add My Office to the home
screen first (Share → Add to Home Screen: it becomes an app, full screen, with its icon). The Mac's phone window counts
the phones and sends a test. Subscriptions are posted only to the browsers' own push services.
- History vault: Claude Code deletes a conversation's transcript after 30 days (
cleanupPeriodDays). The office
data/vault: what you wrote and what Claude answered, its title, folder and times, from every
account, read every 3 hours. No screenshots, commands or their output, so a month of transcripts (GBs) is a few MB.
The chat's ••• → History vault: search everything that was said (with or without Vietnamese accents), read a
conversation laid out, and copy claude --resume while its transcript is still there. OFFICE_VAULT=0 turns
it off.
- Weekly prompt report (the vault's second tab,
?vault=report): the last 7 days of what you wrote to Claude,
... (README truncated for length)