✦ Open source · Apache 2.0 · v1.9.1

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.

Works with LeetCode GeeksForGeeks Codeforces NeetCode takeuforward
5
Coding platforms
6
AI providers, all optional
1
Commit per solved problem
0
Servers that see your code

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.

1

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.

2

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.

3

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.


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.


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.

Repository layout
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
index.json — one entry per problem
{
  "layoutVersion": 3,
  "problems": [
    {
      "id": "lc-two-sum",
      "title": "Two Sum",
      "platform": "leetcode",
      "difficulty": "Easy",
      "tags": ["Array", "Hash Table"],
      "canonical": "two-sum"
    }
  ]
}

See what you actually get

Every screen below is the shipping build — no mockups.

The problem modal showing a solved problem's code, statement, and metadata
Problem view Statement, every approach you submitted, your stats, and the AI review — in one place, without leaving the tab.
The analytics tab with a solve heatmap, difficulty breakdown and topic coverage
Analytics Heatmap, difficulty split, topic coverage and solve velocity, computed locally from your own history.
The knowledge graph tab showing problems linked by topic
Knowledge graph Problems linked by topic and pattern, so the gaps in your preparation are something you can see.
The AI chat panel open beside a LeetCode problem
Problem-level AI chat Ask about the problem you are on. The assistant already has your code, the statement, the constraints and your past review.
A GitHub repository maintained automatically by CodeLedger
Your repository, maintained Clean directories, one commit per solve, and a manifest that keeps every device you use in agreement.
The generated GitHub Pages portfolio site listing solved problems
Generated portfolio An optional GitHub Pages site built from your index.json — a link you can put on a résumé.

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.


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.

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.

Read the source Privacy policy
✓ Gemini ✓ OpenAI ✓ Claude ✓ DeepSeek ✓ OpenRouter ✓ Ollama (local)

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.


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.

⬇ Get the extension Star on GitHub