Schedule a call.
Send a link.
Codepad is a real-time collaborative code pad. Cursors sync like Google Docs. A shared timer runs mock interviews. And a private notestab only you can see — perfect for rubric scoring while your candidate types.
2
3
4
5
6
7
8
9
10
11
12
# 2sum — candidate typing def two_sum(nums, target): seen = {} for i, n in enumerate(nums): need = target - n if need in seen: return [seen[need], i] seen[n] = i return []
06:12Key Features
Cursors like Google Docs, code like your editor.
Labeled carets, tinted selections, jump-to-peer — on top of a real CodeMirror buffer with 40+ language modes. Not a textarea in disguise.
See the comparison →Run mock interviews without a second tab.
A chronograph in the title bar. Pick 25 / 45 / 60 min. Starts for both of you — synced to the second, visible to both of you.
Set up a mock →Score them while they solve it.
Mark a tab private and it stays local to you. Rubric, gotchas, follow-ups. Your candidate never sees it — not in the tab bar, not in the URL.
Share a snippet →The “Google Docs moment” — but for code.
Google Docs made “send me the link” the default for writing. Codepad does the same for a snippet, a scratch file, a take-home. Same ergonomics, right editor.
Google Doc · for code
- ✓Paste-to-share link
- ✓Cursors + selections sync
- ✗Syntax highlighting
- ✗Gutter, line numbers, tabs
- ✗Multiple files in one URL
- ✗Shared countdown timer
- ✗Private-only tabs
A real editor behind the URL
- ✓Paste-to-share link
- ✓Cursors + selections sync
- ✓Syntax highlighting (40+ languages)
- ✓Gutter, line numbers, tabs per pad
- ✓Multiple files in one URL
- ✓Shared countdown timer
- ✓Private-only tabs
A shared timer — for the conversation you’re already having.
Coding interviews are timed. Your pad should be too. Set 45 minutes from the title bar and both of you watch the same arc drain. No extra tab, no stopwatch on your phone, no “how long left?”
# candidate is typing… def two_sum(nums, target): seen = {} for i, n in enumerate(nums): need = target - n if need in seen: return [seen[need], i] seen[n] = i
One click. Both clocks start.
Presets for standard interview lengths. Pick one — your candidate sees the same arc in their title bar, drifting in lockstep.
Score from a private tab.
Check boxes, jot timestamps, rate trade-offs. The whole rubric lives in a tab only you can see — no tab-switching.
Two rooms, one pad.
Mark any tab as private with a single click and it disappears from everyone else’s tab bar. Your notes live alongside the code you’re talking about — in the same URL, the same editor, the same keybindings.
# candidate is typing… def two_sum(nums, target): seen = {} for i, n in enumerate(nums): need = target - n if need in seen: return [seen[need], i] seen[n] = i return []
- ✓06:12 · asked about duplicates — good instinct
- ✓08:45 · brute-force first, called it out
- ✓11:30 · hashmap idea unprompted
- ·explaining O(n) now — watch for confusion about hash collisions
- ·follow-up if time: sorted input? → two pointers
Small stack. Real editor.
The boring-good parts. CodeMirror under the hood, yjs for sync, partykit on the edge, a theme for every light sensitivity.
Yjs CRDT sync
No conflicts, no lost edits — even when a peer drops offline mid-edit.
CodeMirror 6
Gutter, vim bindings, bracket matching. 40+ language modes.
No accounts
Pick a name once. Your pads travel on their URL. Log in only when you want cross-device history.
Read-only snapshots
Flip any pad read-only with one click. Great for posting code in a design doc without a stranger deleting your SQL.
Midnight or paper
Dark default, light opt-in. No flash on load. Each peer picks their own — the doc stays in sync.
MIT-licensed. Self-host on your own partykit.
Next.js + Supabase + PartyKit. npm install, two env vars, npm run dev.
Send the link.
Mock interview in ten minutes. Scratch pad in one. A second browser tab is all the setup your candidate needs.