🎓 For CS students on the job hunt

Lock in. Track the grind. Land your Goal.

Daily goals for every category you grind, a focus timer, a LeetCode log that knows a rerun from a solve, an application tracker with a funnel, schedule blocks that step around your gym and classes, streaks, pace against your plan and a finish-line forecast. Phone first, laptop ready.Daily goals, a focus timer, a LeetCode log, an application tracker and a schedule that steps around your life.

FreeOpen source, MITYour own private databaseSet up in three minutes

Today

Phase 2 · Interview prep🔥 12 day streak☀️ morning💤 Off day
Tue, September 8
AUG 26DAY 14 OF 112DEC 15

Tasks

✓
🧩3 LeetCode problems
Attempts count here too
2/3
✓
📨2 applications
Auto-checks when the counter hits 2
1/2
✓
📚Graph algorithms · week 3 assignment
Day 2 of 3. Shortest paths on a weighted graph, then the write-up. Sort the edges first, the rest follows.

Schedule

9:00 AM
3h
12:00 PM
🔥Block 1
🧩 2h · 📨 1h
12:00 PM
3h
3:00 PM
🎮Free · friends can book
💬 Jordan · 1:00 PM – 2:00 PM
3:00 PM
3h
6:00 PM
🔥Block 2
🧩 1h 30m · 🏗️ 1h 30m
6:00 PM
1h 30m
7:30 PM
🏋️Gym
side task · grind steps around it

Daily counters

🧩 LeetCode
2OF 3
 
📨 Applications
1OF 2
 

Day clock

Two things at once? The one closer to now takes the outer lane.

Focus timer

25:0025 min

Today

Phase 2 · Interview prep🔥 12 day streak☀️ morning💤 Off day
Tue, September 8
AUG 26DAY 14 OF 112DEC 15

Goals

🧩 LeetCode
2OF 3
 
📨 Apps
1OF 2
 
🏗️ Design
0OF 1
 

Focus timer

25:0025 min

The same clock follows you to every tab. Press Done and it asks how the problem went.

Schedule

9:00 AM
3h
12:00 PM
🔥Block 1
🧩 2h · 📨 1h
12:00 PM
3h
3:00 PM
🎮Free · friends can book
💬 Jordan · 1:00 PM – 2:00 PM
3:00 PM
3h
6:00 PM
🔥Block 2
🧩 1h 30m · 🏗️ 1h 30m
6:00 PM
1h 30m
7:30 PM
🏋️Gym
side task · grind steps around it
Watch it work

Four things you will do every day.

The real screens, played through: a solve with its note, a job logged by an agent, a task and a grind session, a block in Quick Copy. The cursor is the only thing that is fake.

1
  1. 1Pick the problem
  2. 2Start the focus timer
  3. 3Press Done, log it
  4. 4Today counts it
  5. 5Write the note
  6. 6Stats: every try
  7. 7Come back to these
  1. 1Tell the agent about the job
  2. 2It writes through the Jobs key
  3. 3The row appears, the goal moves
  4. 4Update the status as it moves
  1. 1Add a task to today
  2. 2Pin it
  3. 3Start grind now
  4. 4Pick what you are grinding
  5. 5The session runs
  1. 1Add a block
  2. 2Give it sub-items
  3. 3Tap to copy
The tour

Every tab, working.

These are the real components on sample data. Change a status, log an attempt, type the PIN, book a slot.

🧩
LeetCode log

Attempts, reruns, one note per problem, solve-time stats.

📨
Applications

A funnel by status, platforms, and an API key for an agent.

📈
Progress

Streak, pace against the plan, weekday pattern, finish-line forecast.

🔒
Share and book

Read-only progress behind a PIN. Friends book your free time.

🤖
API

A read-only key so Claude reads your log the way the app counts it.

Attemptsnewest first
Come back to these
⚡ slow Coin Change ×2 · 48m✕ open LRU Cache ×1 · 25m
MEDIUMCoin Change×2⚡ slow31m
EASYTwo Sum×1✓ solved9m
MEDIUMLongest Substring Without Repeating×1✓ solved22m
HARDLRU Cache×1✕ open25m
MEDIUMNumber of Islands×2✓ solved18m
EASYValid Parentheses×1✓ solved7m

A problem's state is its newest attempt. Reruns stack on the same name, so "solved" means solved clean, not "touched once".

MEDIUMCoin ChangeSAVED

Bottom-up DP over amounts. dp[a] = min coins for a. Slow the first time because I recomputed subproblems; second try 31m.

PYTHON
dp = [0] + [inf] * amount
for a in range(1, amount + 1):
    for c in coins:
        if c <= a:
            dp[a] = min(dp[a], dp[a - c] + 1)
return dp[amount] if dp[amount] < inf else -1
⏱ median 18m↓ 4m vs last week38 solved · 150 target

One living note per problem, with a code block and an array visualiser for pointer problems. The timer's "Done" opens the log with the minutes filled in.

Funnel

Change a status on the right and watch it move.

Platforms
LinkedIn 11Handshake 6Company site 5Referral 2
🤖 Let an agent do the typing

A separate API key gives Claude Code full access to this tab only: log, find, edit, change status, delete. Adding bumps today's counter, deleting takes it back.

Stripe
Software Engineer, New Grad
LinkedInSep 8
Datadog
SWE Intern → FT
ReferralSep 7
Cloudflare
Systems Engineer I
Company siteSep 6
Figma
Early Career Engineer
HandshakeSep 5
Ramp
Backend Engineer
LinkedInSep 4
Notion
Software Engineer, 2027
Company siteSep 3
0🔥 day streak
0ahead of pace
0grind logged
0days target hit
Pace vs plan
38 clean solves · the plan asked for 34 by today
When you actually grind
2.1Sun
5.4Mon
6.2Tue
5.8Wed
4.9Thu
5.1Fri
3Sat
Last 12 weeks
Finish line · Dec 15
🧩LeetCode38 / 150
done 38on pace for 152target 150
At this pace you cross 150 with two days to spare.
📨Applications24 / 120
done 24on pace for 96target 120
On pace for 96. One extra application a week closes the gap.

Pace counts clean solves only. Attempts count for the daily goal. Solve-time stats count solved and slow. Three questions, three sets.

🔒 Progress for friends

A read-only copy of your Progress tab behind a PIN you choose. You decide what shows: overview, LeetCode, grind hours, jobs funnel without company names, off-day reasons.

🎮 Book Sam's free time

Your public page at /u/sam/book. Whatever is left of your bookable windows after grind blocks and side tasks is what friends can grab. Approve or decline from the Friends tab.

1:00 to 2:00 is already Jordan's.
🎮 game💬 talk📋 task

Both live under your handle. Turn the Friends module off and the booking page disappears entirely. The share link stops working the moment you clear the PIN.

Let Claude read your log

A read-only key exposes three endpoints: LeetCode, jobs, progress. Every response starts with a guide that spells out the counting rules for your account, so the model reads the numbers the way the app counts them. Works in Claude Code and in claude.ai chat.

What comes back
{ "guide": { "solvedTotal": "problems whose NEWEST attempt was a clean solve", "attempts": "rows are attempts, not problems; reruns are normal", "timezone": "America/New_York; dates are local days" }, "meta": { "total": 47, "returned": 47, "plan": { "2026-08-26" … "2026-12-15" } }, "stats": { "totals": { "solvedTotal": 38, "slow": 3, "open": 6 }, "medianMin": 18 }, "attempts": [ { "date": "2026-09-08", "name": "Coin Change", "finished": 1, "minutes": 31 }, … ] }

Notes are never returned. The key cannot write. Regenerate it any time from Settings.

Three minutes

Sign up, answer seven questions, grind.

Nothing is seeded and nothing is assumed. The wizard builds your plan, your categories and your schedule, and every answer can be changed later in Settings.

1Create an account

Email and password. No social sign-in, no tracking, no newsletter.

2Set up in seven steps

Each one is a single screen with a live preview. The seven screens run in the order shown below.

3Open Today

Your goals, your blocks, your timer. Log a problem, press + on a ring, check in to a block. The streak starts counting.

Step 2, screen by screen
  1. 1Name
  2. 2Time zone
  3. 3Plan
  4. 4Blocks
  5. 5Categories
  6. 6Side tasks
  7. 7Modules
Yours to shape

Built around your week, not ours.

🧩
Your categories

LeetCode and Applications come with tools. Add system design, a course, reading. Each gets a weekday, weekend and low-load goal.

🏋️
Side tasks

Gym, a class, a shift. Pick the days and hours, optionally a date range. Grind blocks step out of their way.

🌙
Named layouts

Morning, Night owl, Weekend. Switch the default from the Today page, pin one to a weekday.

🪫
Low-load phases

Exams, travel, guests. Goals drop, a lighter layout applies, the streak stays fair.

🌍
Any time zone

Every day, streak and deadline is counted in your own local time. 12 or 24 hour clock.

🧰
Modules

Turn off what you do not use: LeetCode, Jobs, Quick Copy, the day clock, friends booking. The tab and its routes disappear.

Private by construction

Your data lives in its own database.

Every account gets a separate SQLite database inside a Cloudflare Durable Object. There is no shared table of user data, so one user's rows are unreachable from another's by design, not by discipline. A small central store holds only accounts, sessions and key hashes.

  • ✓Export everything as JSON any time. Import it back into any LockIn.
  • ✓Delete the account and the database is gone with it.
  • ✓Public pages (share, booking) are opt-in and sit under your handle.
  • ✓Open source under MIT. Read the code, run your own.