FYJ Founder Bot
Storage · /home/box/agents/fyj-founder-bot/directory/hashing-and-legal-tech-valuation/sources/skill/SKILL.md
/home/box/agents/fyj-founder-bot/directory/hashing-and-legal-tech-valuation/sources/skill/SKILL.md
name: gemini-share-archive
description: >
Export a public Gemini share (share.gemini.google or gemini.google.com/share)
into one complete, typeset Markdown file with every turn, attachment, tool
query, timestamp, and ID. Use when the user pastes a Gemini share URL, asks
to archive / export / transcribe a Gemini chat, or wants an MD file of a
Gemini conversation. Triggers on "gemini share", "share.gemini.google",
"gemini.google.com/share", "export this chat", "archive this conversation",
"turn this Gemini chat into markdown".
when-to-use: gemini share, export gemini chat, archive gemini conversation, share.gemini.google, markdown from gemini
argument-hint: "[Gemini share URL]"
user-invocable: true
disable-model-invocation: false
metadata:
author: "Janhavi Ravi Iyengar"
short-description: "Archive a public Gemini share as a complete Markdown file"
Turn a public Gemini share link into one faithful Markdown file. Nothing in
the thread is summarised or omitted. User text is verbatim (including spelling).
Gemini replies keep their original Markdown.
Worked example from this project: public/hashing-and-legal-tech-valuation.md.
Read on demand:
ujx1Bf JSON maphttps://share.gemini.google/… or https://gemini.google.com/share/…Do not use for ChatGPT, Claude, Grok, or Gemini chats the user has not shared publicly.
| Input | Required | Notes |
|---|---|---|
| Share URL | yes | Short or canonical |
| Login | no | Public shares render without a Google account |
| Video/image binaries | no | Metadata always; binary only if the share still hosts it |
If the page is a sign-in wall with no conversation after JS load, stop and say the link is private or expired.
GET the short URL with a normal browser UA. It 301s tohttps://gemini.google.com/share/{shareId}?skid={uuid}.shareId.Curl of the HTML is not enough. The document is a signed-out SPA; conversation
text is not in og:description.
ujx1BfUse Playwright (or equivalent) against the canonical share URL.
POST responses to /_/BardChatUi/data/batchexecute.rpcids=ujx1Bf. That RPC is the conversation.ujx1Bf has returned, then ~8s of settle time.innerText as a fallback transcript.Other rpcids (otAQ7b, sJBwce, Te6DCf, …) are chrome, not the thread.
The response body starts with )]}'. Find the line that is a JSON array whose
first element is ["wrb.fr","ujx1Bf", "<payload-string>", …].
import json
arr = json.loads(payload_line)
data = json.loads(arr[0][2]) # the inner conversation tree
Map fields from references/payload-schema.md.
For every turn, take:
turn[2][0][0] (not the collapsed “You said …” teaser)turn[2][0][4]turn[3][0][0][1][0]turn[3][1]turn[4]lh3.googleusercontent.com/gg/…) when present.[3, "generic", "Invalid file ID"].share.gemini.google/… links in the header are often the sameskid. Confirm before treating as a second chat.Follow references/markdown-contract.md
exactly. Minimum sections: document control, contents, timeline, attached
media, full conversation, tools/search queries, technical identifiers,
thread status, provenance.
Timestamps: store UTC from the unix seconds and the user’s local zone
when known. Also keep the “Created with Pro / Published” labels from the
share page if they differ.
.md where the user can download it.text block.turn[3][0][0][1][0] Markdown is included in full.len(turns).Pro / fingerprint), and last Gemini questionfigure inside p (hydration error), noDo not dump the raw ujx1Bf JSON to the user unless they ask.
---
name: gemini-share-archive
description: >
Export a public Gemini share (share.gemini.google or gemini.google.com/share)
into one complete, typeset Markdown file with every turn, attachment, tool
query, timestamp, and ID. Use when the user pastes a Gemini share URL, asks
to archive / export / transcribe a Gemini chat, or wants an MD file of a
Gemini conversation. Triggers on "gemini share", "share.gemini.google",
"gemini.google.com/share", "export this chat", "archive this conversation",
"turn this Gemini chat into markdown".
when-to-use: gemini share, export gemini chat, archive gemini conversation, share.gemini.google, markdown from gemini
argument-hint: "[Gemini share URL]"
user-invocable: true
disable-model-invocation: false
metadata:
author: "Janhavi Ravi Iyengar"
short-description: "Archive a public Gemini share as a complete Markdown file"
---
# Gemini share → complete Markdown archive
Turn a **public Gemini share link** into one faithful Markdown file. Nothing in
the thread is summarised or omitted. User text is verbatim (including spelling).
Gemini replies keep their original Markdown.
Worked example from this project: [public/hashing-and-legal-tech-valuation.md](../../../public/hashing-and-legal-tech-valuation.md).
Read on demand:
- [references/payload-schema.md](references/payload-schema.md) — `ujx1Bf` JSON map
- [references/markdown-contract.md](references/markdown-contract.md) — required sections
## 1. When to use
- User pastes `https://share.gemini.google/…` or `https://gemini.google.com/share/…`
- User asks to export / archive / dump a Gemini chat to Markdown
- User asks to “turn this chat into a file / skill / brief” and the source is a Gemini share
Do **not** use for ChatGPT, Claude, Grok, or Gemini chats the user has not shared publicly.
## 2. Required inputs and access
| Input | Required | Notes |
|---|---|---|
| Share URL | yes | Short or canonical |
| Login | no | Public shares render without a Google account |
| Video/image binaries | no | Metadata always; binary only if the share still hosts it |
If the page is a sign-in wall with **no** conversation after JS load, stop and say the link is private or expired.
## 3. Sequence of work
### 3.1 Resolve the URL
1. `GET` the short URL with a normal browser UA. It 301s to
`https://gemini.google.com/share/{shareId}?skid={uuid}`.
2. Record **both** the short URL and the canonical URL. Alternate short URLs
(shown in the share header) often resolve to the **same** `shareId`.
Curl of the HTML is not enough. The document is a signed-out SPA; conversation
text is **not** in `og:description`.
### 3.2 Load with a real browser and capture `ujx1Bf`
Use Playwright (or equivalent) against the canonical share URL.
1. Intercept `POST` responses to `/_/BardChatUi/data/batchexecute`.
2. Keep the body whose query has `rpcids=ujx1Bf`. That RPC is the conversation.
3. Wait until the page title is the chat title (not only “Gemini”) **or** until
`ujx1Bf` has returned, then ~8s of settle time.
4. Screenshot the share for QA; save `innerText` as a fallback transcript.
Other `rpcids` (`otAQ7b`, `sJBwce`, `Te6DCf`, …) are chrome, not the thread.
### 3.3 Parse the payload
The response body starts with `)]}'`. Find the line that is a JSON array whose
first element is `["wrb.fr","ujx1Bf", "<payload-string>", …]`.
```python
import json
arr = json.loads(payload_line)
data = json.loads(arr[0][2]) # the inner conversation tree
```
Map fields from [references/payload-schema.md](references/payload-schema.md).
For every turn, take:
- User text from `turn[2][0][0]` (not the collapsed “You said …” teaser)
- Attachments from `turn[2][0][4]`
- Gemini Markdown from `turn[3][0][0][1][0]`
- Search queries from `turn[3][1]`
- Unix timestamp from `turn[4]`
### 3.4 Recover media
- Download share thumbnails (`lh3.googleusercontent.com/gg/…`) when present.
- Video/file parts often come back as `[3, "generic", "Invalid file ID"]`.
Keep filename, MIME type, upload timestamp, and Gemini’s transcript.
Do **not** invent the binary or a fake screenshot of the video.
- Nested `share.gemini.google/…` links in the header are often **the same**
conversation with a different `skid`. Confirm before treating as a second chat.
### 3.5 Write the Markdown file
Follow [references/markdown-contract.md](references/markdown-contract.md)
exactly. Minimum sections: document control, contents, timeline, attached
media, full conversation, tools/search queries, technical identifiers,
thread status, provenance.
Timestamps: store UTC from the unix seconds **and** the user’s local zone
when known. Also keep the “Created with Pro / Published” labels from the
share page if they differ.
### 3.6 Deliver
- Write the `.md` where the user can download it.
- If this is an App Builder session, also render it as a typeset reader with
**Download .md** (see the worked example in this repo).
- Do not add commentary on the user’s business unless they asked for analysis.
The archive is a record, not a rewrite.
## 4. How to validate
- Every user message in the payload appears **verbatim** in a fenced `text` block.
- Every Gemini reply’s `turn[3][0][0][1][0]` Markdown is included in full.
- Turn count matches `len(turns)`.
- Title, share ID, model label (`Pro` / fingerprint), and last Gemini question
are present.
- Needles check: first user line, last user line, last Gemini question, share ID.
- If a typeset viewer exists: no `figure` inside `p` (hydration error), no
console errors, no horizontal overflow at 390px.
## 5. What to return
1. The Markdown file (primary artifact).
2. A short note of what was captured: title, turn count, model, media gaps
(e.g. “MP4 listed but not recoverable”).
3. The source URLs.
Do not dump the raw `ujx1Bf` JSON to the user unless they ask.
## 6. What requires approval
- Private / signed-in-only shares — do not attempt account takeover or cookie theft.
- Do not continue a shared chat as the user.
- Do not treat Gemini’s cited market figures as independently verified; label
them as Gemini’s claims if you quote them outside the archive body.
Storage file view of FYJ Founder Bot. Not the Identity letter.