Skip to main content

defossil

Status: prototype. No tests yet; anything can change without backward compatibility.

Improve your English by reviewing your own chats with AI coding agents. The name comes from "fossilized errors" — recurring mistakes that stick in a learner's language. You already write a lot of English when talking to agents like Claude Code and Codex. defossil collects those messages, reviews them with an LLM, and gives you two things:

  • Corrections — one per mistake: your fragment, the fix, and a short note on how to say it better.
  • Reports — the most valuable part. A short lesson over many corrections: the mistakes you repeat, the native-language patterns in your phrasing, shorter ways to say what you keep saying long — real examples from your own text. Fast to read and a realistic picture of your English.

How it works

One background thread — the pipeline — runs the whole chain every 5 minutes: collect → classify → review → report. Nothing else creates corrections or reports, so both tables are append-only and no step races another. The dashboard only shows what the pipeline did.

  1. Collect — archive every message you typed, verbatim, into SQLite, deduplicated by the source's own key. Only real typed text: tool output, command expansions, and programmatic runs are skipped. Sources: Claude Code and Codex CLI; one module per source.
  2. Classify — stamp each new message pending / non-english / too-short / no-prose / too-long, once. Only pending goes to review; the text itself is never rewritten.
  3. Review — send pending messages to the LLM in batches, store what it corrects — real mistakes and style (wordiness, calques, register) — as corrections, and stamp the messages reviewed. A message is reviewed once, ever. On the dashboard a correction can be acknowledged, and the explain button asks the LLM for a deeper explanation.
  4. Report — a markdown lesson over each corrections_per_report corrections: repeated mistakes, native-language patterns, shorter phrasings, one focus habit until the next report. Reports are stored and never regenerated.

Architecture

webCore → feature service → Db. Core is a container and the lifecycle: it opens the database, builds one service per feature, starts them in order and stops them in reverse. A feature is one job, named after the record it owns: message (the archive and its sources), correction, report, setting, and ai — every prompt the app sends, plus the ai_calls log of what each call cost. Every table has exactly one owner, and only the owner writes SQL against it. Features reach each other through self.core.services.<other>.

The schema evolves through append-only migrations (core/migrations.py, tracked by PRAGMA user_version), so it can change without dropping data. Nothing is redone: a message is classified and reviewed once, corrections and reports only accumulate. The archive is the one thing the sources cannot give back (Claude Code deletes transcripts after ~30 days), and nothing drops it.

Usage

Python, FastAPI, SQLite. LLM calls go through the claude CLI by default (claude -p — works with a Claude subscription, no API key); a setting switches to codex exec. Local only: data never leaves the machine except text sent for review.

Run defossil, open http://127.0.0.1:3677.

Settings

The data root cannot live in the database it locates, so it is the one setting outside it: ~/.local/share/defossil by default, overridden only by --data-dir. Everything else — native language, AI backend, model and effort per prompt category, source roots, batch sizes, page size — lives in the settings table, is edited on the dashboard's settings page, and is read at use time, so a change applies without a restart.

Non-goals

Decided against — do not re-propose or implement:

  • Exercises — drills, quizzes, flashcards, spaced repetition built from the stored mistakes. The app shows mistakes and writes reports, nothing more.
  • Dismissing false positives — a "not a mistake" flag. Premature: the archive shows no false positives yet.
  • Fossils page — a page grouping corrections by category and fragment. Fragments group only when they repeat verbatim, so it adds little over the corrections page and the report.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

defossil-0.0.3.tar.gz (77.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

defossil-0.0.3-py3-none-any.whl (102.0 kB view details)

Uploaded Python 3

File details

Details for the file defossil-0.0.3.tar.gz.

File metadata

  • Download URL: defossil-0.0.3.tar.gz
  • Upload date:
  • Size: 77.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.4 {"installer":{"name":"uv","version":"0.12.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for defossil-0.0.3.tar.gz
Algorithm Hash digest
SHA256 e8628f982bc2b2805eed55ba26830d4654ed946a82271587edf9d8c90ad70093
MD5 dad926fec884db9d7defbb86e97102b2
BLAKE2b-256 6339d30b5899224bf9a4b582fe50abde321a7c9c258aed43b7b250179936f19b

See more details on using hashes here.

File details

Details for the file defossil-0.0.3-py3-none-any.whl.

File metadata

  • Download URL: defossil-0.0.3-py3-none-any.whl
  • Upload date:
  • Size: 102.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.4 {"installer":{"name":"uv","version":"0.12.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for defossil-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 6e5dac16c9ac019a8c124150c589551a721e898b8115f0595fcd71145aeddda5
MD5 83149d289f5c5cb920867960f9aaf3fd
BLAKE2b-256 e3ab759cf3a0c56858fde3aa5c6d62d94fdb82a9befa9cd32bf2afdfd335f022

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page