Tyler Garrett
Screenshot 2026-06-08 at 8.11.03 PM

Tyler Garrett

Founder, dev3lop

Screenshot 2026-06-06 at 2.11.28 PMScreenshot 2026-06-06 at 9.01.20 AMScreenshot 2026-06-04 at 10.34.36 PMScreenshot 2026-06-09 at 6.55.41 AMScreenshot 2026-06-09 at 6.54.28 AMScreenshot 2026-06-08 at 9.23.33 PM

Recent

general What’s cheating anyways Jul 10, 2026

I’ve been very fortunate enough to be 100% referral based all year. Before this, we were 100% search engine optimization. No matter how good I think I am at seo, somebody’s better at cheating. No matter how good I think I am at hacking, somebody’s better at cheating. One reason I’m interested in BJJ is because you can’t cheat to be better, you actually have to work at it. today, I did a move that I’ve only seen people do in videos, I tried to do something I’ve never learned. Instantly I hear a noise in my knee. im in the ice tub, right now, im okay.. ai let’s me try something i saw a video of on YouTube, but doesn’t mean it will come out great if I’ve never done it before. It just means ai will do something, and someone might get hurt in the process.

Open →
general Skin missing... missing skin on the Distal Interphalangeal (DIP) joint Jul 8, 2026

Ah, the classic "Gi Burn" on the knuckles! That raw, missing skin on the Distal Interphalangeal (DIP) joint—right where the finger wrinkles below the nail—is another classic rite of passage for a BJJ white belt. [1, 2] When you are death-gripping a sleeve or collar, your partner will use explosive movements to tear your hands off. As the heavy, woven cotton of their Gi is ripped violently out of your hands, it acts like coarse sandpaper right across the tops of your bent finger joints, literally shaving the skin off. Because your skin is missing, keeping the area clean is vital to prevent staph, ringworm, or other common mat infections. [3, 4]

🩹 Off-the-Mat Healing Protocol

  • Wash Immediately: The second class ends, scrub your hands thoroughly with defense soap or an antimicrobial soap using lukewarm water. Avoid scorching hot water, which dries out and splits the skin further. [4, 5, 6, 7]
  • Keep It Moist: Do not let it dry out and crack. Apply a thick layer of Aquaphor Healing Ointment or Neosporin, then cover it with a standard adhesive bandage before bed to let the skin regenerate. [7, 8, 9]
  • Moisturize Daily: Dry skin rips much easier than hydrated, elastic skin. Apply a heavy, non-water-based lotion or salve to your knuckles during the day when you aren't training. [1, 8]

🥋 How to Protect It While Rolling

Standard adhesive bandages will fly off within the first 30 seconds of warm-ups due to sweat and friction. Use this stacking method to keep training: [10]

  1. The Shield Layer: Apply a thin layer of liquid bandage (like New Skin Liquid Bandage) directly onto the clean, dry raw spot. Let it dry completely. This creates a waterproof, sweat-resistant artificial scab that seals the nerve endings and keeps bacteria out. [1, 10]
  2. The Anchor Tape: Take a thin strip of 0.3" or 0.5" rigid athletic tape. Wrap it securely 2 to 3 times around the phalanx below the raw wrinkle, and 2 to 3 times above it (right near the base of the nail). [2, 11, 12]
  3. The "X" Guard: Cross the tape diagonally over the sides of the joint to connect the top and bottom loops. Crucially, leave the actual raw wrinkle exposed or lightly covered without tension so you can still fully bend your finger into a fist for boxing and BJJ. [2, 12, 13, 14]

To make sure I don't pick up a nasty infection, I'm using NEOSPORIN and taking a few days off. Attempting the keep it wet thing. lol

1] [https://www.reddit.com 2] [https://www.youtube.com 3] [https://www.instagram.com 4] [https://www.princetonbjj.com 5] [https://www.kingz.com 6] [https://www.firstderm.com 7] [https://skinintegra.com 8] [https://www.reddit.com 9] [https://www.reddit.com 10] [https://www.youtube.com 11] [https://grapplersperformx.com 12] [https://www.nagafighter.com 13] [https://www.youtube.com 14] [https://pillarsports.com

Excited to announce my domain name, 3 gyms into the journey, found a good local one near me called atos, and gracie barra have been the best, will keep track here: 1] [bjj.ac

Open →
general dev.md — YeeYee: the whole-project arc Jul 8, 2026

Purpose. A single onboarding map for a new dev: every major subsystem across the project's full history, what each one does, roughly when it landed, and whether it's shipped / gated / TODO. This is the breadth view. For the running feature timeline see [CHANGELOG.md](CHANGELOG.md); for subsystem deep-dives see [building_block/editor/README.md](building_block/editor/README.md) (editor) and [scripts/reward/phd.md](scripts/reward/phd.md) (the training pipeline / eval).

The one-sentence project: a local-first, offline LLM code editor whose thesis is the agent does the work — plus a full home-grown loop to mine real edit history, train ("forge") a small local coding model on it, and honestly evaluate whether that training actually helps.

The arc, four eras:

EraRoughlyWhat it is
0 — Foundation2025-01 →Monaco editor + Gateway backend + multi-app workspace + storage abstraction
1 — The Forge (mine → train → eval)2026-01 → 2026-06Harvest real edits, SFT a local yee-coder, and an honest eval/scoring instrument
2 — Hard mode editormatured pre-2026-06The full-power editor: Ty AI pipeline, agent loop, codebase index, provider routing
3 — Easy mode / YeeYee2026-06-28 → 2026-07-08Glass chat-to-code surface, live preview, chat branches, Python Space, per-language tuning

Legend: ✅ shipped & verified · 🟡 built, gated on a paid eval run · 🧭 partial / next-phase · ❌ not started... (no client data is used in the creation of this stats, only personal projects)


Era 0 — Foundation (2025-01 →)

Documented in the [dir_agent level-up logs](dir_agent/changelog.md) (2025-01-30/31). The bedrock the rest is built on.

FeatureWhat it doesWhenStatus
Monaco editor shellElectron desktop editor: file tree, tabs, diff mode, Chokidar file-watching, keyboard bindings, high-contrast a11y2025-01
The GatewayNode WebSocket control plane wrapping the local model: NDJSON streaming, reconnect/backoff, sessions, latency probe2025-01
YeeAgent chatChat service with persistent history + shared CODE_APPLICATION_RULES prompt2025-01
Multi-app workspaceApp-per-directory + MainMenu router (cycleplus, lightcycle, calendar, calculator, crm, musica, kanban, whiteboard…)2025-01
Storage abstractionstorageService + swappable backend (localStorage / Electron / future Postgres); 25 collections2025-01
dir_agent intelligenceSQLite + FTS5 full-text search over the codebase's own docs (BRAIN, changelog, ux-*)2025-01

Era 1 — The Forge: mine → train → eval (2026-01 → 2026-06)

The home-grown pipeline that harvests real edits, trains a local model, and measures it honestly. Lives under [scripts/reward/](scripts/reward/); the research log is [phd.md](scripts/reward/phd.md). The whole dashboard is served by forge-server.mjs at /forge.

GitHub harvesting / author mining (⛏ Mine)

FeatureWhat it doesWhenStatus
Edit warehouse~14.3K SFT pairs mined from ~5 months of real edit history (2026-01-09→2026-06-16), 65% GitHub; segmented by repo2026-06
⛏ Mine tabPaste a GitHub profile → harvest that author's own apply-verified edits → append git-<login>.jsonl to the warehouse2026-06
Author rosterAvatar + public/🔒-private pill + coverage + top-segment + "race on 4-bit"; reads public repo lists from HTML (no API budget)2026-06
Private-repo miningOwner's own repos mined locally from disk (gato/dev3lop/bloog…≈9.9K edits); GITHUB_TOKEN-gated, never via public API2026-06
Traceable rowsEvery mined edit carries github_url back to the exact commit — auditable, non-redistributive2026-06
Topic discovery + race/api/mine/discover-topic, /api/mine/race, combine-train — discover authors, race their data on the 4-bit base2026-06

SFT LLM builder (the local `yee-coder`)

FeatureWhat it doesWhenStatus
MLX SFT trainingFine-tune yee-coder locally via MLX (venv/caffeinate); 8-bit (4-bit NaNs) — train_local.py2026-06
Prompt-contract sealOne byte-identical prompt across prepare/eval/serve (buildSftPrompt) so train==eval==serve2026-06
Leak-clean dataset buildprepare_sft.js --exclude-ids, segment-build.mjs; disjoint train vs held-out enforced2026-06
Decoupled eval-workerSeparate eval process fixed the "climb-then-collapse" training artifact (eval_worker.py)2026-06
DPO from rejected editsContrastive negatives (negatives.jsonl) → dpo_pairs.py / dpo_train.py seed2026-06
Edit-reward / swe_checkPivot to EDIT-domain real-repo reward: run a repo's real tests → "resolved"; validated on Django2026-06🧭 next: edit-DPO from SFT trajectories

The Forge dashboard (`/forge`)

FeatureWhat it doesWhenStatus
Live training dashboard/forge shows runs live, per-run dropdown, launch/stop, base-model picker2026-06
Split-test tournamentSegment mined edits by folder, race each on a shared frozen held-out, branch into the winner, prune noise; live tree-map (tournament.mjs)2026-06
Canvas engineEvent-sourced single-writer daemon + ML-judge autopilot grows a tree of repo/folder segments toward the best training data (canvas-core.mjs)2026-06🧭 Phase 1 done; Phase 2 (interactive pan/zoom) + synthesize TODO
Data library (◧ Data)Scores the data segment (not the model): standalone vs marginal value; /api/data-library.json2026-06🧭 shipped; Composer + export-bundle next
Export bundleZip a scored data segment to hyper-train elsewhere (export-bundle.mjs)2026-06

The honest eval instrument (the part the author is proudest of)

FeatureWhat it doesWhenStatus
Apply-success metricReference-based RLVR: score 100 only if the edit applies cleanly through the real searchReplace.js engine; diff-F1 ladder, 0.3 floor2026-06
Leak gateeval-leakage-check.mjs — closes all 3 train/eval leak channels (found a 100% Run-mode leak, fixed it)2026-06
Frozen stratified held-outmake-heldout.mjs — deterministic, group/content-excluded, hash-stamped (24→96 tasks)2026-06
Bootstrap CIGreedy point estimate + bootstrap confidence interval, never a lonely number (eval_live.py)2026-06
pass@keval_live.score_passk + PASSK worker verb2026-06✅ built
gen2 scoring eraSave every model response + 5 judge lenses (form audit, helpfulness, trajectory, calibration, attribution) to re-score data2026-06
gen3 Opus-judgeInstruction-satisfaction rubric; honest apply-success + honesty gap (judge_score − byte), trust-checked2026-06
Data-quality scoringOpus-score the 330K mined corpus (data_quality.py, resumable); ~33% keep-rate; embedding-distill (κ0.48) ranks all free, Opus adjudicates the uncertain band2026-06
Quality-selected poolbuild_quality_pool.py → leak-clean, quality-weighted SFT pool that removes the honest-correct collapse2026-06

Headline finding (honest): SFT buys format compliance, not correctness. Lead with +22pts apply-rate and −0.122 honesty gap and the format win — never brag the ~1% (noise-level). See [phd.md §18 claims ledger](scripts/reward/phd.md).


Era 2 — Hard mode editor (matured pre-2026-06)

The full-power "awesome" editor. Deep-dive: [building_block/editor/README.md](building_block/editor/README.md). The local-model pipeline here is "paused, not gone" — the frontier/provider path took the lead for Easy mode.

Ty AI — the multi-stage edit pipeline

FeatureWhat it doesStatus
RewriterTurns a casual prompt into a precise instruction; gated by a specificity score (only rewrites if <45)
Locator (3-stage)Finds the exact excerpt + line range — deterministic (LanceDB index), LLM, or skip
ExecutorInstruction + excerpt → one SEARCH/REPLACE block
2/3-stage modes + named arrangementsSave/load rewriter→executor(→locator) combos; three built-in

The editing engine

FeatureWhat it doesStatus
SEARCH/REPLACE coreShared engine (shared/lib/searchReplace.js) — single source of truth for Apply, Cmd+K, agent tools
6-strategy fuzzy matchexact → trimEnd → whitespace → case-insensitive → block-anchor → line-similarity (≥0.9); returns closest region on miss
Smart retryFeeds the closest actual file region back to the model (up to 2×)
Whole-file fallbackFiles <400 lines: full rewrite through diff review
Diff review modalMonaco side-by-side, Accept (⌘↵)/Cancel (Esc), 12s Undo toast
Cmd+K inline editSelect code → ⌘K → instruction → one applied block

Agent (Auto mode) & orchestration

FeatureWhat it doesStatus
Agentic tool-use loopagentLoop.js: read/edit/run until done; tools emit fenced JSON
Tool setread/write/edit_existing/search_replace/single_find_and_replace/multi_edit/insert_code/list_files/run_terminal
Approval gatesEdits via diff review (auto-approve toggle, off by default); terminal always prompts (once / always / deny)
Self-correctionPost-edit lint self-heal (≤2), one-round project verify, terminal-error feedback
Kill switchStop button aborts via AbortController
Parallel plan executionorchestrator.js pure DAG scheduler (bounded concurrency) + global apply-lock (single diff modal); cycle/deadlock guards
Behavior modesEdit (one change) / Plan (checkable numbered plan) / Auto (full loop)

Context, models, backend, security

FeatureWhat it doesStatus
Codebase vector indexLanceDB + nomic-embed-text via Ollama; incremental, code-aware chunking; status pill; ripgrep fallback
@-mentions@codebase (semantic) / @<file> (specific); autocomplete
Models tabSystem resources, running/installed/available, quantization picker, live pull; "Oh Snap" RAM gate
The MixBenchmark harness for model arrangements; perfect-score requires a clean apply through the real engine
Provider routingmlx:/yee:/local: → forged local model · openai:/anthropic: → frontier · unprefixed → Gateway/Ollama; unified usage struct powers the token meter
Plan & summarization (Python)Agent 008 writes .yeeyee/plan.md; context summarizer condenses old turns
Security modelWorkspace sandbox (realpath + symlink refuse), approval gates, contextIsolation, CSP, DOMPurify, localhost-only
Integrated terminalxterm.js + node-pty per session, command approval allowlist

Era 3 — Easy mode / YeeYee (2026-06-28 → 2026-07-08)

The glass chat-to-code surface for non-experts — the current push. Full timeline in [CHANGELOG.md](CHANGELOG.md). Commit hashes below are from that log.

FeatureWhat it doesWhenStatus
Easy-mode chat roomFull-window glassmorphism chat-to-code + WebGL shader; pi-style collapsible tool cards with inline diffs2026-06-28
Live preview + fix loop▶ runs the repo's dev server in an in-app webview; console + stderr feed back to the agent as a one-round fix loop; lifecycle-hardened (tree-kill, timeouts, EADDRINUSE)2026-06-28
One-window workspace☰ repos & chats navigator + file tree (auto-refresh) + per-session terminal; switching chats swaps the workspace2026-06-28
SQLite persistencechatStore.js (sql.js, no native build); chats survive restart and re-seed context2026-06-28
Per-edit farmingApproved edits auto-apply + auto-write training rows; deleting a chat/repo prunes its rows2026-06-28
"Under the hood" split-testingSplit-test your agent's context, promote what measures leaner (CI-gated promote)2026-07-01
Python SpaceJupyter-quality notebook surface, zero Jupyter dependency (+ hardening pass)2026-07-02/03
Language-tier chipsHonest per-language capability ladder in-app + launch screen2026-07-03
Element pickerClick an element in the preview → agent jumps to its file:line (9 review fixes)2026-07-03
Screenshot → chat (vision)Agent sees the rendered preview; white-screen crash fixed via main-process capture2026-07-04
Direct-first tool routingKills the workspace-less-gateway bug class at the source2026-07-04
Chat branchesGit-backed checkpoint/branch DAG for AI chats: 3-way conflict resolution, AI-suggest, undeniable merge graph, permanent panel; per-repo scoping fix2026-07-04/0581e3ff8
Repo-map tree fallback (#5)Non-code files (config/docs/data) stop vanishing from the agent's map; own budget; binaries still skipped2026-07-05
Data-integrity (#6)Split-test streams localStorage→SQLite; live prompt-cache-break guard2026-07-05
Per-language-group tuning (#7)Packs/scores/eval keyed by (model, group: js-ts/css-html/python/general); live chat auto-uses its repo's group's pack; language: tab strip2026-07-06b986741e362658
Measured model save%Retired the hardcoded per-model save% for a measured per-language average; honest "unmeasured" until a real run2026-07-069da86d8
Variance-robust measurementStratified log-ratio bootstrap + hard n≥5 floor; powered-n advisory not veto — the honest token-savings instrument2026-07-07
Per-language prompts SHIPNative, tier-aware wd/rm/pa prompts per (model, group); guarded against silent collapse to identical2026-07-08

Open / gated / not started

The forward roadmap ("🗺 Priority Tracker", 2026-07-04 synthesis in [CHANGELOG.md](CHANGELOG.md)).

ItemStateBlocker
#1 — Element-pick + verify-compaction bench cells🟡 built, adversarially reviewed, dry-tested (37/37)Awaiting Ty's paid eval run for the CI verdict — no headline until MIN_PAIRS clears
#3 — Python S− eval cell🟡 built, reviewed, fixed (60/60 dry)Awaiting paid run; no tier promotion until a significant CI
#4 — Human-anchored honesty slice❌ not started≥50–100 gold edits, ≥2 annotators + κ, non-Opus judge (week+). Retires the two biggest phd.md §18.3 caveats
Canvas engine Phase 2🧭 partialInteractive pan/zoom canvas + synthesize step
Data library Composer🧭 partialConnect→race-union + export-bundle wiring
Edit-reward → edit-DPO🧭 nextswe_check validated on Django; next is edit-DPO from SFT trajectories

Completion — where we're at

Two honest denominators, because "% done" depends on what you're counting.

A) Current roadmap (Priority Tracker: P0 + #1–#7 = 8 items). This is the active push.

  • 5 fully done & verified (P0, #2, #5, #6, #7)
  • 2 code-complete, gated on a paid eval run (#1, #3)
  • 1 not started (#4)
  • 62.5% validated-only, ~81% crediting the two gated items at half.

B) Whole product. The four eras are each substantially built and shipping. Foundation, the Forge (mine/train/eval), and the hard-mode editor are effectively complete and in daily use; Easy mode is the maturing surface. The genuinely open work is narrow: a handful of gated eval runs (#1/#3), one unstarted research slice (#4), and two next-phase polish items (Canvas Phase 2, Data-library Composer). By breadth of shipped-and-verified subsystems, the project is ~85–90% of the way to the public launch scope, with the remaining gap concentrated in validation (spending API money to earn the honest CIs) rather than in unbuilt features.

The load-bearing caveat (house rule): no headline without a cell. Several features ship with their token-savings claims deliberately unclaimed until a paid eval run produces a significant confidence interval. Don't promote anything from #1/#3 until the CI clears. The single biggest measurement gap is #4 (human ground truth) — the only unstarted item and the most expensive.


Sources: [CHANGELOG.md](CHANGELOG.md) · [building_block/editor/README.md](building_block/editor/README.md) · [scripts/reward/phd.md](scripts/reward/phd.md) · [dir_agent/changelog.md](dir_agent/changelog.md). Keep this file's era tables in sync when a subsystem materially changes; keep CHANGELOG.md as the running log.

Open →
general Python Space: we built a Jupyter kernel from scratch so notebooks feel native in Yee Jul 3, 2026

Yee has been unapologetically web-first. React, Vite, Astro, Tailwind — that's where the live preview, the token-efficiency tooling, and every measured number live. If you write web apps, the differentiated machinery is all pointed at you.

Python was the awkward middle child. The agent could edit Python beautifully — grep, ranged reads, symbol maps, traceback detection, the command interceptor that already knew uvicorn from flask — but there was no preview. No ▶. A data scientist opening a Python repo got a competent text editor and a chat box, which is exactly what Cursor and Claude Code already do. We were honest about it: in our own LANGUAGES.md tier list, Python sat at A−, and the one thing holding it back was written down in plain language — no preview surface.

So we built one. And the shape it wanted to take was obvious the moment we said it out loud: a notebook is Python's preview.

The idea: a notebook that primaries as files

The pitch was a "huge Python space you can just start using with your Python or Jupyter files" — but with a twist that matters. It shouldn't be a notebook app bolted onto a code editor. It should primary as regular file tooling and feel like Jupyter on top.

Concretely: Python Space is a third body for the same sliding pane that hosts the web preview. Where a React repo shows a <webview>, a Python repo shows a dark-glass cell list. But there's no hidden notebook database — the cells are your .ipynb (or a .py with # %% markers) on disk. The human runs cells with Shift+Enter; the agent edits the same file with its normal tools; the pane live-reloads the instant the agent's edit lands. Two views of one file. Nothing to sync, nothing to diverge.

That framing paid off immediately, because it meant Python Space could inherit the entire preview lifecycle Yee already had — the ▶ button, per-repo state, the honest "here's what's happening" awareness note the agent reads every turn. We didn't build a new subsystem. We taught an existing one a new trick.

The hard part: a kernel, from scratch, over plain `python3`

Here's the decision that shaped everything. We refused to depend on Jupyter.

Not jupyter, not ipykernel, not the ZMQ kernel protocol. If Python Space required a pip install before your first cell ran, we'd have failed the "just start using it" promise for a huge fraction of users — the ones on a locked-down machine, a fresh venv, a corporate environment where installing Jupyter is a ticket. Yee's whole thesis is a high-quality JavaScript ecosystem that hosts Python gracefully; the kernel had to be ours.

So the kernel is a ~250-line pure-standard-library Python script (bootstrap.py) that Node spawns and talks to over stdin/stdout with a line-delimited JSON protocol. Simple in outline. The interesting part is what happens in its first ten lines.

Making the protocol unforgeable

A naive version of this has a gaping hole: if the kernel talks to Node over stdout, and user code can also print() to stdout, then a cell that runs print('{"kind": "done"}') can forge a protocol message. Worse, a subprocess the user spawns inherits that same stdout. You cannot trust a single byte.

The fix is a small piece of Unix plumbing that runs before any user code can execute. The kernel duplicates the real stdin/stdout to private handles, then points the public file descriptors somewhere harmless:

  • fd 0 (stdin)/dev/null. User input() gets a clean, immediate EOFError — it can never read

a protocol request meant for the kernel.

  • fd 1 & 2 (stdout/stderr) → capture pipes. Everything user code writes — print(), C-extension

output, and crucially, subprocess output — flows into pipes that a reader thread forwards to Node as JSON stream messages. The text lands inside a JSON string, structurally incapable of forging a frame.

  • The real stdout, now private, carries the protocol. Every message is also prefixed with a random

per-session nonce, so Node drops anything that isn't ours as a belt-and-suspenders second line of defense.

We wrote adversarial tests that try to forge frames — a nonce-prefixed print, a raw os.write(1, ...), a subprocess echoing a fake message — and confirmed every one arrives as honest, quoted text. That test file spawns a real python3 and runs 43 assertions against it; it's the load-bearing proof that this thing is safe.

Persistent state, REPL semantics, and the little niceties

Because it's one long-lived process, your variables survive between cells — the entire point of a kernel versus a script runner. Load a dataframe in cell 2, use it in cell 8. We parse each cell's AST so that a trailing bare expression gets evaluated and its repr shown, exactly like a real Python prompt, with _ bound to the last result. matplotlib figures are captured to inline PNGs after each cell if you imported pyplot — and cost nothing if you didn't.

Then we went looking for the walls — before users did

Here's where the process matters as much as the code. Shipping a notebook surface and hoping real notebooks work is a great way to have data scientists bounce on their first file. So before calling it done, we ran an adversarial audit: 85 agents across five "hardcore Python user" personas — someone opening a real Jupyter export, someone deep in conda/poetry hell, someone running tqdm loops and multiprocessing, someone with a 50MB notebook, someone who lives in Django. Each finding was checked by two independent verifiers reading the actual code, so we fixed real bugs, not hypotheticals.

They found 40 confirmed walls. A few were exactly the kind of thing that ends a first impression:

  • The %matplotlib inline wall. The single most common first line in notebooks in the wild is an

IPython magic — and plain Python treats %matplotlib inline as a syntax error. Cell 1 of every real notebook would have failed. We added a compatibility layer that only activates when a cell fails to parse (so pure-Python cells are never touched), transforming magics, !shell commands, %%bash blocks, and obj? help syntax, and seeding display() and get_ipython() shims that exported notebooks call. Now cell 1 just runs.

  • The "my imports fail" wall. When you launch a Mac app from the Dock instead of a terminal, it gets

a bare PATH with none of your shell's environment — no conda, no pyenv, no Homebrew. So a conda user's import pandas would fail against Apple's stock Python while the exact same import worked in the integrated terminal. Maximally confusing. We now capture your login shell's environment at startup (the well-worn "fix path for shell" trick) and detect poetry/pipenv virtualenvs that live outside the repo. Your env is your env, however you launched.

  • The torch.save wall. An ML engineer defines a model class in a cell and pickles it — and it

breaks, because the cell namespace wasn't a real __main__ module. We made it one. Now pickle/torch.save/joblib of cell-defined classes resolve correctly, and multiprocessing spawn stops re-executing the kernel into its own pipes.

Plus a long tail: top-level await, pandas HTML tables and interactive-plot handling, tqdm progress bars, sys.exit() that doesn't kill the kernel, atomic crash-safe saves, a file-watcher that survives git/black/atomic-rename saves, and — importantly for backend developers — a Django repo is no longer hijacked into a notebook, and clicking a plain utils.py references it in chat instead of spawning a kernel. (One of the hunt's findings was even a real UI bug in code we'd already shipped: the output drain could chop a line mid-word right before a cell finished.)

We fixed roughly 36 of the 40 and wrote down the rest — an explicit interpreter picker, big-notebook virtualization, a couple of edge cases — because "we know about it and it's logged" is a very different posture than "we didn't think of it." None of the deferred items block the first run.

Where Python sits now

Python moves from A− to A in our tier list: a real preview surface, wall-hardened for the notebooks and environments people actually have. We're deliberately not claiming the top S− tier yet, because our own rule says a tier claim needs a measured eval behind it, and the "edit a Flask route while the kernel's live" benchmark doesn't exist yet. That's the next honest step.

But the thing we set out to build is real and running: open your Python or Jupyter files and just start using them — cells that run, plots that render, state that persists, an agent that watches and fixes, and not a single pip install jupyter in sight.


Under the hood: lib/pybridge/bootstrap.py (the kernel), lib/pyKernel.js (lifecycle), lib/pythonEnv.js + lib/shellEnv.js (environment detection), lib/notebook.js (the one parser), app/pySpace.js (the surface). ~130 assertions across five test suites, plus live smoke against real python3. Full engineering log in the root [CHANGELOG.md](../CHANGELOG.md) → "Deep engineering log".

Open →
general I guess I'm not immune to injury Jul 3, 2026

As I sit here chasing this idea of want to go train in BJJ today, I also think about how it's close to a holiday, healthcare is shitty in the USA, and I don't want a broken finger during the holidays. It's strange that's where my brain is going today, it's kinda my main concern with BJJ right now. I'm starting to realize my fingers are being sacrificed to learn more. However given how hard it is to actually see a doctor, and actually get health care in the USA that is helpful, it's difficult for me to jump at the idea of training on my birthday, mostly because my birthday falls a day before the 4th of july, a day where the worst of the worst doctors will be at the hospital, training. I don't wanna be someones training day, on a holiday, when all they want to do is play golf in the sun, and all I want to do is break their arm.

Look doctor, over there, a giraffe, they look that way, and I put them into an arm bar.

Now, who needs a doctor, you stupid son of a biiiiiiiiiiiiiiiiiiiiiiiitch.................

Open →

Building j7 — a minimal place to chat, blog, and keep a portfolio.

j7, by dev3lopcom, llc