Your DSA journey,
committed.
Every accepted LeetCode, GeeksForGeeks, Codeforces, NeetCode and takeuforward solution is pushed to your own GitHub repository — with an optional AI review, analytics, and a knowledge graph. Your data, your keys, your repo.
How it works
Three steps to a complete DSA portfolio
No accounts. No database. No dashboard to log into. Just an extension, your GitHub repo, and — if you want it — your own AI key.
Install and connect GitHub
Sign in with GitHub. CodeLedger asks for
public_repo and workflow — enough to create a repository,
push to it, and write the GitHub Pages workflow. Choose the broader
repo scope instead if you want your solutions private.
Add AI keys (optional)
Paste a Gemini, OpenAI, Claude, DeepSeek, OpenRouter, or local Ollama key under Settings → AI. Keys live in your browser's extension storage and are sent only to the provider you chose. Skip this and everything else still works.
Solve as usual
Get an accepted verdict on any supported platform. CodeLedger notices, collects the metadata and problem statement, runs the review if it is configured, and pushes everything in one commit.
What happens on accept
From verdict to commit, in one pass
The whole path runs inside your browser. The only outbound calls are to the coding platform you are already on, your chosen AI provider, and GitHub.
Detect
A per-platform handler watches for the accepted verdict — via the page, the platform's own API, or both.
Capture
Code, language, difficulty, topics, runtime and memory stats, the problem statement, and your solve time.
Resolve
The same problem on two platforms maps to one canonical folder, so your repo has one entry per problem, not per site.
Review
If AI is configured, your code is reviewed and the result is committed alongside it. Skipped entirely when it is not.
Commit
One atomic push through the GitHub Trees API — solution, README, and the updated
index.json together or not at all.
Your repository
Readable by a human, not just a tool
CodeLedger writes plain files you would have written yourself. Every problem directory
renders on GitHub as a page, because the metadata lives in a README.md.
problems/
two-sum/ # canonical, shared across platforms
leetcode/
lc-two-sum.py
lc-two-sum-hashmap.py # a second approach
README.md # statement, stats, AI review
geeksforgeeks/
gfg-two-sum.java
README.md
cf-1873A/ # no canonical match yet
cf-1873A.cpp
README.md
chats/ # saved AI conversations, as markdown
index.json # the manifest every device reads
README.md
{
"layoutVersion": 3,
"problems": [
{
"id": "lc-two-sum",
"title": "Two Sum",
"platform": "leetcode",
"difficulty": "Easy",
"tags": ["Array", "Hash Table"],
"canonical": "two-sum"
}
]
}
Inside the extension
See what you actually get
Every screen below is the shipping build — no mockups.
index.json — a link you
can put on a résumé.
Features
Everything you need, nothing you don't
Plugin-based architecture — platforms, AI providers and git hosts are self-contained directories, so adding one never means editing the core.
Atomic git commits
The GitHub Trees API writes your code, metadata and review as a single commit. No half-written state, no burst of noisy commits cluttering your history.
AI code review
Gemini, OpenAI, Claude, DeepSeek, OpenRouter, or local Ollama. Rotate several keys per provider and fall back automatically when one is rate-limited.
Analytics dashboard
Heatmap, topic radar, difficulty donut, solve velocity — all built from your local database and drillable down to a single problem.
Knowledge graph
Problems are linked by topic and algorithmic pattern, drawn as an interactive force-directed graph so coverage gaps are obvious.
Cross-device sync
Your repository is the sync channel. Problems, chats and portable settings reconcile
through index.json — no third-party sync service in the middle.
Canonical problem mapping
Solve the same problem on two sites and it lands in one folder, with a subdirectory per platform, instead of two unrelated copies.
Duplicate detection
When you re-solve something, CodeLedger shows you both versions and asks what to keep. It never silently overwrites work you already committed.
Problem-level AI chat
Ask anything about the problem in front of you. Conversations are saved as markdown
under chats/, so they travel with your repo.
GitHub Pages portfolio
Opt in and CodeLedger commits a workflow that publishes a dark/light portfolio built from your own manifest — no build step on your side.
Streaks and self-hosted badges
Set your own daily minimum, bank freezes for the days you miss, and pause it for a
holiday. The badges are SVGs committed to badges/ in your repository —
nothing is fetched from a counter service that could go away.
Compare with friends
Add a friend by pasting their public repository — no invite, no account, and following them does not oblige them to follow you. Progress is read straight from the repository they already publish, and the comparison page keeps nothing.
Chrome and Firefox
One codebase, no bundler, no transpiler. A small compatibility shim is the only place browser APIs differ.
Import your back catalogue
Already have hundreds of solves? Import your existing LeetCode, GeeksForGeeks or Codeforces history and backfill the repository in one run.
Bring your own everything
Your repo, your AI keys, your account. The project runs exactly one server — the OAuth relay — and it never sees any of it.
Supported today
What is shipping, stated plainly
This table is the whole list. Anything not on it is not in the build.
| Area | Supported | Notes |
|---|---|---|
| Coding platforms | LeetCode, GeeksForGeeks, Codeforces, NeetCode, takeuforward | Each one is an independent handler directory. |
| Browsers | Chrome, Edge, Brave, Firefox | Manifest V3 in both packages. |
| Git host | GitHub | The commit path is written against the GitHub Trees API. |
| AI providers | Gemini, OpenAI, Claude, DeepSeek, OpenRouter, Ollama | All optional; Ollama runs entirely on your machine. |
| Sync | Through your own repository | Periodic reconciliation plus a check at browser start. |
| Account required | None | GitHub sign-in is the only identity involved. |
Privacy
Where your data actually goes
The honest version, not a reassurance. Two columns: what never leaves your browser, and every destination that does receive something.
Stays in your browser
- Your solutions, before they go to GitHub
- Your AI API keys, in extension storage
- Your GitHub access token
- Analytics, the knowledge graph, and solve history
- Every setting, including the ones never synced
Leaves your browser
- GitHub — your code and metadata, sent directly to the API with your own token
- Your AI provider — your code and the problem statement, only when you have configured a key
- The OAuth relay — your GitHub authorisation code, exchanged for a token and not retained
- Anyone with the link — your solutions and streak badges, if you keep the ledger repository public. Making it private keeps both to you.
- shields.io — one request per README view, only if you switch your badges from the self-hosted SVGs to shields. Your numbers still come from your own repository; shields only draws them.
- mermaid.ink — the source of one diagram, and only when you press Render on it. Never automatic.
-
Anonymous counter — a solve ping of
{ platform, version }, only if you switch on Anonymous Usage Stats. Off by default.
Five of those seven are choices you make, and the extension shows you the same list live under Settings → Privacy, computed from your own configuration. Full detail in the privacy policy.
Bring your own everything
Your solutions live in your GitHub repo. Your AI keys stay in your browser. The project runs exactly one server — the OAuth relay — and it never sees your code or your keys.
Under the hood
Built to be read and contributed to
Plain ES modules, no bundler, no transpiler. Clone it, load the folder unpacked, and the thing you are debugging is the thing that shipped.
FAQ
Common questions
Is CodeLedger free?
Yes, completely. It is open source under Apache 2.0. You bring your own GitHub account and, optionally, your own AI API keys. There is no subscription and no paid tier.
Does it upload my code to any server?
Your code goes directly from your browser to GitHub's API — never through ours. The
only server this project runs is the OAuth relay at
codeledger.vkrishna04.me/api, which exchanges your GitHub authorisation
code for an access token and does not retain it. One optional exception: if you switch
on Anonymous Usage Stats in Settings (off by default), a solve-event counter
— { platform, version }, no code, no token, no identifier — is sent to
counter.vkrishna04.me.
What GitHub permissions does it ask for?
By default public_repo and workflow.
public_repo is what lets CodeLedger create your repository and push to
it; workflow is only needed because the optional portfolio writes a file
under .github/workflows/. If you would rather keep your solutions
private, grant the broader repo scope instead — that is the only
difference between the two.
Which browsers are supported?
Chrome, Edge, Brave and other Chromium browsers via the Chrome Web Store, and Firefox via AMO. Both are built from one codebase with separate manifests, so features do not diverge between them.
Do I need an AI key?
No. AI review is entirely optional. Without a key CodeLedger still detects accepted submissions, collects the metadata and statement, and commits everything to your repository — you simply get no review section in the README.
Which AI providers are supported?
Gemini, OpenAI, Anthropic Claude, DeepSeek, OpenRouter, and local Ollama. You can set a primary and a fallback, and hold several keys per provider so a rate limit on one does not stop the review.
Can I use an existing GitHub repository?
Yes. During onboarding you can point CodeLedger at a repo you already have. It appends
under problems/ and maintains a single index.json at the
root; your existing files are left alone.
How does cross-device sync work?
Your repository is the sync channel. Each device reconciles against
index.json when the browser starts and periodically afterwards, pulling
problems and chats it has not seen. There is no sync server and nothing to sign up
for.
What happens if the same problem is solved twice?
CodeLedger detects it and shows you both versions side by side — the one in your repository and the one you just submitted — with a choice of which to keep or how to merge. Nothing already committed is overwritten without you saying so.
Where is the Library?
Inside the extension. It is where your problems, analytics, knowledge graph, chats and settings live. There is no hosted copy to sign into — that is the point: the data is on your machine and in your repository.
Can I import problems I have already solved?
Yes. LeetCode, GeeksForGeeks and Codeforces profile imports backfill your existing accepted submissions into the same layout, so your repository starts complete rather than from today onward. Codeforces publishes which problems you solved and when, but not the code you wrote, so those arrive as dated entries with an empty solution.
What can a friend see if I add them?
Only what their repository already publishes to anyone. Adding a friend stores their repository name on your machine and reads the badge files from it — there is no request to them, nothing is written to their repository, and they are not told. It works in the other direction only if they add you too. A private repository cannot be read this way and is shown as not shared, and turning streaks off removes your own badge files on the next commit.
What if a platform changes its page and detection breaks?
Selectors live in a single dom-selectors.js per platform, with a legacy
set kept as a fallback, so a fix is usually a few lines. If you hit a break, an issue
with the URL and the verdict you saw is enough to act on.
Stop losing the work you already did
Every problem you have solved and never saved is a portfolio you do not have. Install once, then solve exactly the way you already do.