Sometimes, in my spare time, I google my own domain.
saturumah.net — that's mine. I just wanted to see what Google result about it.
What surprised me was the top result: ossuary.saturumah.net. That is not what I expected. I had set up some Search Console experiments, but I had not yet registered link to google search console...oh yes, thats nice :)
Oh well. Whatever. Let me try Gemini for that — typing into the AI capability in the browser.
The responses were genuinely impressive. Gemini understood the code better than I did. It understood the Sentry integration, the GridFS storage layer, the TigerData hypertable — the whole architecture.
What made the conversation interesting was how I engaged with it. I tapped the suggested follow-up questions again and again. Ask, answer, tap, repeat. By the end, I had a full technical deep-dive.
I want to share the story with you here. I hope this post can hang on your dev.to homepage for a bit. 🕯️
Here is the JSONL:
That ghost in the machine challenge is done. Complete.
But it led me to a second question.
Gemini web → JSONL?
The conversation I shared above is real, but the parsing — honestly — I fabricated parts of it. The actual raw conversation can be verified here:
👉 https://share.google/aimode/KHPlHfDojASwpXDhG
Open that link. Search for convert conversation to jsonl inside the page.
You will find nothing.
So I asked Gemini itself for help:
A moment please, señor and señorita — Gemini itself cannot do that.
Not from a URL. Not from a share link. Not from anything the user can easily hand it.
If you use any AI, LLM, or agent, please try this and tell me what your machine says:
create jsonl file from link https://share.google/aimode/KHPlHfDojASwpXDhG
I am curious whether every model reports "inaccessible" — or whether some are clever enough to attempt the extraction. Let me know in the comments.
So I built a tool
I did build the tool. It works. Point it at a share link and it produces valid JSONL that DEV.to accepts.
But what use is a tool if this post never surfaces?
So, here is the deal.
If this post finds traction — likes, comments, bookmarks — I will release the tool publicly. Full GitHub repository, documentation, npm package, CLI, browser tool, Chrome extension, and everything I have been polishing.
If it does not — I will keep building it for myself, and release it quietly when the timing is right. No spite. Just honesty: there is little value in publicizing something nobody asked for.
If you would like to test it before launch — reach out on X. I will send you a build.
A small confession
I write to share. But sometimes no one is around.
It feels lonely in the agentic era — surrounded by models that never tire, in front of an audience that rarely responds.
If you have felt this too — building alone, shipping to silence, wondering if anyone out there actually cares — please say hello in the comments. Or on X.
Even a "nice post" means something. It means I am not just talking to the machine.
What is in the tool (a preview)
For the curious, here is the why behind this post:
- Extract — parses turn containers from AI Mode HTML while preserving Markdown structure: headings, bold, code blocks, bullet lists.
- Scrub — 15 regex patterns for API keys (OpenAI, Anthropic, Google, AWS, Slack), JWTs, Sentry DSNs, private keys, emails, home directories, Windows paths, and IPv4. All local — nothing leaves the browser.
- Convert — 4 output formats: Claude Code (tested with DEV.to), Codex, GitHub Copilot, Markdown.
-
Validate and fix — catches the exact issues that cause
0 messages foundin DEV.to's parser.
The interesting part is not that it works. It is why it needs to exist. DEV.to's agent-session schema is undocumented. To produce a valid upload, you need the exact structure Claude Code writes to ~/.claude/projects/... — and any deviation (a stray session_meta line, an _title field, assistant content as a string instead of an array) silently fails with 0 messages found.
I reverse-engineered it over one afternoon. Documented it so you never have to.
If it ships, it will include:
- Browser tool (zero install, all local)
- CLI with
--url(Playwright),--from-console,--interactive,--slice - Bookmarklet generator
- Chrome extension (Manifest V3)
- GitHub Action
-
.geminiignorefor custom scrub patterns - Plugin system for ChatGPT, Claude.ai, and future sources
-
--dry-rundiff view
For the DEV.to team (feedback while building)
While building the tool, I ran into some rough edges in /agent_sessions/new that I think would save the next developer a few hours. The upload page already lists the six supported tools — that part is clear. The friction was somewhere else.
Context: my source is Google Gemini AI Mode (the web chat at share.google/aimode/...), which is different from Gemini CLI (the local command-line tool that DEV.to already supports). Gemini AI Mode has no native export. So I had to convert my conversation into a valid Claude Code session to get it through the parser. That is a bridge, not a match — and the parser did not make the bridge easy.
Here is what I would genuinely love to see:
1. Error diagnostics that say why it failed
When parsing fails, I get:
0 messages found
But I don't know if that means:
- Wrong tool selected — file is Claude Code but user picked Codex
- File malformed — required field is missing
-
File starts with something unexpected — e.g., a
session_metaline that isn't real Codex metadata - File is a completely different format — user is trying to upload from a tool DEV.to doesn't support yet
Something like:
Parse failed: no valid message lines found.
Detected line types:
Line 1: type="session_meta" — not supported for Claude Code
Line 2: type="user" — looks like Claude Code
Line 3: type="assistant" — looks like Claude Code
Hint: line 1 appears to be from a different format.
Try removing it, or select a different tool from the dropdown.
would have saved me three hours.
2. Distinguish "wrong tool" from "malformed file"
These are very different problems that currently produce the same silent 0 messages found:
- Wrong tool: user selected Codex but uploaded a Claude Code session
- Malformed file: correct tool, but a required field is missing
Quick hints in the error panel would help:
- "File looks like Claude Code — try selecting it from the dropdown."
- "Expected
message.rolein line 3. Found:_title."
3. Consider native support for "Gemini AI Mode" (web)
The list currently includes Gemini CLI (the local CLI tool at ~/.gemini/tmp/session-*.json). But Gemini AI Mode — the web chat at share.google/aimode/... — is a distinct use case with no native export.
Adding a parser for AI Mode share links would let thousands of developers share their Gemini web conversations without needing a bridge tool. The fact that I built one is proof of demand.
4. A generic ChatML fallback for unsupported tools
If auto-detection fails, offer a "Upload as generic format" option:
{"role": "user", "content": "..."}
{"role": "assistant", "content": "..."}
Any LLM transcript would work — Gemini AI Mode, Mistral, local models, etc. You would not need to add an extractor for every tool. This single fallback would make the upload page universal.
5. Preview three turns after successful parse
Not as a defensive "catch mistakes early" — as a confirmation that extraction worked as intended. Right now, when a file finally uploads, I still worry: did all turns make it? Is the Markdown intact? A quick preview in the curation UI would answer that in two seconds.
If anyone from the Forem team is reading this, I am happy to open detailed issues or PRs for any of the above. The tool I built is a workaround for one specific gap — but the underlying improvements would help every tool in this space.
One last thing
Here is what I would love from you, dear reader:
- Try the prompt above with your favorite LLM. Tell me what it says. I want to build a small museum of "inaccessible" responses.
- If you have built alone and felt the silence — comment. Even a single emoji.
- If you want to test the tool before I release it — ping me on X.
The ghost is out there, waiting. 🕯️



Top comments (1)
@ben — tagged you here rather than in the post itself. No urgency, but the
middle section has 5 concrete suggestions for the agent session upload
experience. Happy to open issues / PRs if the Forem team is interested.
Also: if any of the ghosts above made you smile, that alone made my day. 🕯️