Turn manual Excel processes into reviewable, reproducible marimo notebooks.
Project description
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.
Or, offline and standalone — the analyser is useful on its own:
kedge inspect process.xlsx --out analysis.json --report report.html
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
CONVENTIONS.md is binding — read it before opening a pull request. CLAUDE.md is the shortest
useful orientation to the codebase, and RELEASING.md covers how a version tag becomes a release.
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kedge-0.0.1.tar.gz.
File metadata
- Download URL: kedge-0.0.1.tar.gz
- Upload date:
- Size: 822.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e17cc2d3491ac7aea96d922225bc6691f4e478396f561be0f7600234a862143
|
|
| MD5 |
fd6f9ab02920c001e3d247e3d8870d52
|
|
| BLAKE2b-256 |
6ebe0938d37d6f4c6d86ad91020b050dd7c4f02dd35cd748999f5b1900d58fa9
|
Provenance
The following attestation bundles were made for kedge-0.0.1.tar.gz:
Publisher:
release.yml on OpenAfterHours/kedge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kedge-0.0.1.tar.gz -
Subject digest:
1e17cc2d3491ac7aea96d922225bc6691f4e478396f561be0f7600234a862143 - Sigstore transparency entry: 2253795824
- Sigstore integration time:
-
Permalink:
OpenAfterHours/kedge@1e8990178dc26e8919e454196e9bd5ddda70a5f5 -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/OpenAfterHours
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1e8990178dc26e8919e454196e9bd5ddda70a5f5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file kedge-0.0.1-py3-none-any.whl.
File metadata
- Download URL: kedge-0.0.1-py3-none-any.whl
- Upload date:
- Size: 517.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ad7207b1a77afb5ce8d30e31e33354aa1108d93c568c5b0f44373d9011c267f
|
|
| MD5 |
643e3d13afdc1101310e4fe53e929969
|
|
| BLAKE2b-256 |
d97d0892c64e47cb4687b16a285a2f73bc0defe799172327e9d384da34a6c6fa
|
Provenance
The following attestation bundles were made for kedge-0.0.1-py3-none-any.whl:
Publisher:
release.yml on OpenAfterHours/kedge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kedge-0.0.1-py3-none-any.whl -
Subject digest:
9ad7207b1a77afb5ce8d30e31e33354aa1108d93c568c5b0f44373d9011c267f - Sigstore transparency entry: 2253795877
- Sigstore integration time:
-
Permalink:
OpenAfterHours/kedge@1e8990178dc26e8919e454196e9bd5ddda70a5f5 -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/OpenAfterHours
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1e8990178dc26e8919e454196e9bd5ddda70a5f5 -
Trigger Event:
push
-
Statement type: