January 15, 2026
Context Debt: The Silent Killer of Weekend Projects
Every time you step away from a side project, you accumulate context debt. Eventually the cost to reload exceeds the time you have. Here is what that looks like, and how to stop it.
I have a side project that is, by most measures, about 70% done. I know this because I wrote the TODO at the top of main.ts. I know the feature list, the rough architecture, the two blockers I need to push through.
What I cannot remember: why I moved the auth logic into a middleware, what that commented-out block in userService.ts was guarding against, and why there is a v2 branch that diverged three months ago with no description.
That is context debt. And it is quietly killing the project.
What Context Debt Actually Is
Context debt is the accumulated mental state required to make forward progress on a piece of code. Not the tasks. Not the bugs. The understanding: the variable names you kept in working memory, the constraint you reasoned around, the edge case you deferred because you were mid-refactor.
Every developer carries this automatically while actively working. It is cheap to maintain when you are in flow. It evaporates the moment you switch off.
When you come back, the bill is due. You have to reconstruct that state from scratch: reading diffs, chasing // TODO comments, reverse-engineering your own decisions. The codebase has not changed. The cost to re-enter it has compounded.
Think of it like a process that gets swapped out of memory. Resuming it is not free. You have to page everything back in, and some of it is no longer in cache.
Why To-Do Lists Fail at This
To-do lists track tasks. Tasks are future-oriented: “add email validation,” “fix the 401 on refresh,” “write tests for the parser.”
Context is present-oriented. It is the state right now: which function you were editing, which assumption is temporarily broken, which thread of logic is half-complete.
A to-do list tells you what to build next. It says nothing about where in the codebase your brain was when you last stopped.
The result is a cold boot every single time. You open the list, see “fix the 401,” and spend 20 minutes just re-reading code before you can even reproduce the problem. The task was tracked. The context was not.
This is not a failure of discipline. It is a failure of tooling. To-do lists were not designed to persist mental state.
The 15-Minute Window Problem
Here is the actual constraint most people never state clearly: weekend or evening coding sessions are rarely longer than 90 minutes. Often less.
Of those 90 minutes, a non-trivial chunk gets burned on context reload. If the project has been dormant for two weeks, that reload cost can easily hit 20-30 minutes. For a 45-minute session, that is more than a third of the available time spent just getting back to zero.
At some point the math stops working. The session is too short to justify the startup cost. So you skip it. And the debt compounds further.
This is not a motivation problem. It is a latency problem. The time-to-productive is too high for the session budget available.
The fix is not “find more time.” The fix is reducing the startup cost so the 15 or 45 minutes you actually have can be spent making progress, not recovering state.
Persisting Local Context
The pattern that works is treating context like any other volatile state: checkpoint it before you lose it.
Not a task list. Not a ticket. A literal dump of where your head is right now, written for the version of you that will reopen this in two weeks with no memory of today.
Something like: “Stopped mid-way through the token refresh. The issue is in refreshTokenService.ts line 42. The fix is probably a race condition on the isRefreshing flag. Do not touch the AuthContext yet, it is mid-refactor. Next step: add a mutex around the refresh call and rerun the integration test.”
That is not documentation. It is a core dump. You are externalising working memory before the process gets swapped out.
KeepGoing is a tool built around this idea. It prompts you to write one of these notes when you end a session, and surfaces it the next time you open the project. No dashboards, no streaks. Just a persisted local context that makes cold boots cheaper. It works with VS Code, Claude Code, and GitHub Copilot, so your context is available whether you resume in your editor or through an AI assistant.
Context debt compounds silently. The only way to pay it down is to stop letting sessions end without a checkpoint.