kedge
Turn manual Excel processes into reviewable, reproducible marimo notebooks, with an AI copilot that operates the notebook through a controlled tool surface.
Status: under active construction. See
PLAN.mdfor the full brief.
What it does
- Analyses a workbook offline — formula regions, dependency graph, SQL connections,
Power Query M, cached values, and a findings list (circular refs, volatile functions,
IFERRORswallowing, inconsistent formulas within a region). - Plans the conversion — an AI-proposed, user-approved
ProcessPlandescribing stages, open questions, and what it intends to drop. - Scaffolds a marimo notebook from the approved plan.
- Reconciles the generated Python against the values Excel last cached, so the translation checks itself against evidence rather than declaring itself finished.
Quick start
uv tool install kedge
kedge hub # a browser landing page: every workbook kedge has seen
kedge open process.xlsx # straight to one, if you already know which
kedge hub starts the server with nothing open and puts a browser on the list. Add a workbook by
browsing the filesystem, pasting a path, or dropping one on the page; each row shows whether the
file is still there, whether a notebook and an approved plan exist, how many findings the analysis
turned up and how much of the workbook the plan believes it can convert. Opening one runs the same
sequence kedge open runs — clean up, analyse, plan, scaffold, spawn marimo, bootstrap the session
— with the progress streamed into the page, and lands you in the chat-plus-notebook view. Where a
marimo kedge started is still running, the hub offers to reattach rather than starting a second.
The AI half needs an endpoint. Open Settings on the hub and give it an OpenAI-compatible base
URL, a key and a model — the hosted API, a gateway, or something local. The base URL and model go
to ~/.kedge/config.toml; the key goes to the operating system's keyring and never to a file.
Until a key is stored, workbooks open in demo mode, where a scripted agent answers and nothing is
sent to a model — so the analysis, the scaffold and the notebook all work with no endpoint at all.
Behind a corporate proxy, kedge verifies the endpoint against your operating system's trust
store rather than against Python's bundled certifi, so a TLS-inspecting proxy whose root your
IT department has already installed just works. Where it does not, kedge doctor says which
certificates are in play and what to do; the fix is ca_bundle under [model], pointing at the
proxy's root as a PEM. There is no option to disable verification (SECURITY.md says why).
Reasoning is set in the same panel, and left unset by default. kedge prefers the responses API
because it is the only one that carries a reasoning model's thinking across a tool call, and every
kedge turn is tool calls. Neither that choice nor the reasoning setting can end a turn: an endpoint
with no /responses route is discovered on the first call and spoken to in chat completions from
then on, and a request refused over reasoning is retried without it. Pin api under [model] in
~/.kedge/config.toml to skip the probe.
Or, offline and standalone — the analyser is useful on its own:
kedge inspect process.xlsx --out analysis.json --report report.html
docs/analyser-worked-example.md walks that output line by line over two of the test fixtures —
a clean pipeline and a deliberately hostile workbook — which is the quickest way to see what the
analyser actually finds before pointing it at anything of your own.
Once the notebook exists, hand-ins arrive through a watched folder rather than by hand:
kedge watch process.xlsx --dir \\share\inbox --once # sweep and exit; for a scheduled task
kedge watch process.xlsx # watch until Ctrl-C
Every file is copied into the workbook's managed store, hashed, dated and receipted, so "this run
consumed this file" is a claim you can defend. --once is idempotent: a file already in the store
is skipped by hash. --dir is relative to where you are standing; set ingest.watch_dir in a
kedge.toml beside the workbook instead and it is relative to the workbook, so a scheduled sweep
finds the same folder you did.
Design notes
- Generated code is polars, never pandas — enforced in the validation gate.
- Excel's semantics do not match polars' (rounding mode, empty-vs-null, divide-by-zero).
kedge.xlis a registered polars namespace that makes each compatibility choice explicit and greppable:col("amount").xl.round(2). - Single-user, local, loopback-bound. No accounts, no server deployment.
Contributing
CONTRIBUTING.md is the short version; CONVENTIONS.md is binding — read it before opening a
pull request. CLAUDE.md is the shortest useful orientation to the codebase, RELEASING.md
covers how a version tag becomes a release, and SECURITY.md describes the actual trust boundary
(loopback, no auth, the machine rather than the account), which is worth reading before touching
anything that binds a socket or logs a payload.
uv sync
uv run pytest # unit + corpus
uv run pytest -m contract # live-kernel tests; spawns a real marimo
uv run ruff check . && uv run ruff format --check .
uv run python scripts/guardrails.py
Apache-2.0.
Release files for kedge 0.0.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| kedge-0.0.6.tar.gz | 1.0 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| kedge-0.0.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.6 MB
Release files / kedge-0.0.6.tar.gz
| Download URL | kedge-0.0.6.tar.gz |
|---|---|
| Size | 1.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
410f09c1a2ffaa46b76382ab91a9eeca7f5be21eb4239385b7a9f3569f8d98c7
|
|
BLAKE2b-256 checksum How to use checksums |
f2fda230002f0a37bf4fb432ada42f3ca72147e0c36e9c58a93736ef1e58306c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.
Transparency logRelease files / kedge-0.0.6-py3-none-any.whl
| Download URL | kedge-0.0.6-py3-none-any.whl |
|---|---|
| Size | 566.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7354541c42c58c18d7818f5f8805bfc58c411511feb6b5bb0beac7da2f55c522
|
|
BLAKE2b-256 checksum How to use checksums |
f36d3d2dc716b53d1f24b762cb3018a0ac288aedcf7870a918fcdf53ff159aa7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.
Transparency log