From 573a00ad4a7ed0fadecfa74db1045d14b4a3ae04 Mon Sep 17 00:00:00 2001 From: Ewan Croft Date: Thu, 21 May 2026 09:11:01 +0100 Subject: [PATCH] docs: add llms.txt to all web interfaces --- packages/bismuth-web/static/llms.txt | 38 +++++++++++++++++++++ packages/croft-click/static/llms.txt | 26 ++++++++++++++ packages/jasper-web/static/llms.txt | 46 +++++++++++++++++++++++++ packages/malachite-web/static/llms.txt | 42 +++++++++++++++++++++++ packages/opal-web/static/llms.txt | 47 ++++++++++++++++++++++++++ packages/tourmaline/static/llms.txt | 47 ++++++++++++++++++++++++++ 6 files changed, 246 insertions(+) create mode 100644 packages/bismuth-web/static/llms.txt create mode 100644 packages/croft-click/static/llms.txt create mode 100644 packages/jasper-web/static/llms.txt create mode 100644 packages/malachite-web/static/llms.txt create mode 100644 packages/opal-web/static/llms.txt create mode 100644 packages/tourmaline/static/llms.txt diff --git a/packages/bismuth-web/static/llms.txt b/packages/bismuth-web/static/llms.txt new file mode 100644 index 0000000..7997a98 --- /dev/null +++ b/packages/bismuth-web/static/llms.txt @@ -0,0 +1,38 @@ +# Bismuth + +> Convert ATProto richtext-block documents from Standard.site publications to Markdown. + +Bismuth is a free, open-source, browser-based tool that converts ATProto richtext-block documents from Standard.site publications — Leaflet, Pckt, and Offprint — into clean Markdown. No data leaves the browser. No sign-in required. + +## Supported formats + +- Leaflet: pub.leaflet.content and site.standard.document records with full block support (headings, paragraphs, lists, images, embeds). +- Pckt: blog.pckt.content with inline and blob-mode content resolution. +- Offprint: app.offprint.content including task lists, web embeds, and coloured highlights. + +## What's converted + +Headings (h1–h6), paragraphs and line breaks, bold/italic/strikethrough, ordered and unordered lists, links and images, fenced code blocks, block quotes, task lists (Offprint). Embeds are represented as links. Complex layouts are flattened. + +## Pages + +- /: Landing page and feature overview +- /convert: Document converter (paste JSON or upload a .json file) +- /about: Privacy details, supported formats, CLI usage, licence, and credits + +## Privacy + +Runs entirely in the browser. Documents are parsed locally and never uploaded to any server. No cookies, no local storage, no fingerprinting. + +## CLI + +Also available as a Node.js CLI tool. Clone https://github.com/ewanc26/pkgs, install dependencies in packages/bismuth, then run `pnpm start input.json`. + +## Licence + +AGPL-3.0-only + +## Author + +Ewan Croft — https://ewancroft.uk +Support: https://ewancroft.uk/support diff --git a/packages/croft-click/static/llms.txt b/packages/croft-click/static/llms.txt new file mode 100644 index 0000000..482e05d --- /dev/null +++ b/packages/croft-click/static/llms.txt @@ -0,0 +1,26 @@ +# croft.click + +> Landing page for Ewan Croft's suite of open-source AT Protocol tools. + +croft.click is the central hub for a collection of browser-based tools that help users move their data to the open social web via the AT Protocol (ATProto). All tools are free, open-source, and run in the browser with no server-side data storage. + +## Tools + +- Jasper (jasper.croft.click): Import Instagram photos, stories, and videos to Grain or Spark on ATProto. Original timestamps preserved, duplicates skipped. +- Malachite (malachite.croft.click): Import Last.fm and Spotify listening history to Teal (fm.teal.alpha lexicon). Smart deduplication and sync support. +- Bismuth (bismuth.croft.click): Convert ATProto richtext-block documents from Standard.site publications (Leaflet, Pckt, Offprint) to Markdown. +- Opal (opal.croft.click): Convert microblog posts from Twitter, Mastodon, Threads, and Nostr to Bluesky. Original timestamps preserved. +- Tourmaline (tourmaline.croft.click): Analyse Teal.fm scrobble history. Personality archetypes, genre profiles, mood mapping, and share-to-Bluesky. +- Devlog (devlog.croft.click): Changelog and devlog for Ewan's projects, published via Sequoia on ATProto. + +## Pages + +- /: Project index with cards for all tools + +## Source + +https://github.com/ewanc26/pkgs + +## Author + +Ewan Croft — https://ewancroft.uk diff --git a/packages/jasper-web/static/llms.txt b/packages/jasper-web/static/llms.txt new file mode 100644 index 0000000..0cafa70 --- /dev/null +++ b/packages/jasper-web/static/llms.txt @@ -0,0 +1,46 @@ +# Jasper + +> Import Instagram photos, stories, and videos to Grain or Spark on ATProto. + +Jasper is a free, open-source, browser-based tool that imports an Instagram data export to Grain (grain.social) or Spark (sprk.so) on the AT Protocol. Original timestamps are preserved and duplicates are skipped. No data is sent to any intermediate server — photos are uploaded directly from the browser to the user's PDS. + +## What's imported + +- Photos (JPEG, PNG, WebP, GIF) with original timestamps +- Captions (as alt text) +- Carousel posts (multiple photos) +- Videos (MP4, MOV) — Spark only +- Stories — Spark only + +Not imported: Reels. Videos and stories are not supported by Grain. + +## How it works + +1. Download an Instagram data export as JSON from Instagram settings. +2. Upload the ZIP or extracted folder in the import tool. +3. Authenticate with an AT Protocol identity via OAuth. +4. Photos are uploaded directly to the user's PDS with original timestamps. + +## Pages + +- /: Landing page and feature overview +- /import: Import tool (OAuth sign-in and file upload) +- /about: Privacy details, what's imported, OAuth scope, and how to get an Instagram export + +## OAuth scope + +Grain: `atproto blob:*/* repo:social.grain.photo repo:social.grain.gallery repo:social.grain.gallery.item` +Spark: `atproto blob:*/* repo:so.sprk.feed.post repo:so.sprk.story.post` + +## Privacy + +Runs entirely in the browser. Instagram exports are processed locally and uploaded directly to the user's PDS. No cookies, no local storage, no fingerprinting. + +## Licence + +AGPL-3.0-only + +## Author + +Ewan Croft — https://ewancroft.uk +Support: https://ewancroft.uk/support diff --git a/packages/malachite-web/static/llms.txt b/packages/malachite-web/static/llms.txt new file mode 100644 index 0000000..f066b26 --- /dev/null +++ b/packages/malachite-web/static/llms.txt @@ -0,0 +1,42 @@ +# Malachite + +> Import Last.fm and Spotify listening history to Teal on ATProto. + +Malachite is a free, open-source tool that imports listening history from Last.fm CSV exports and Spotify JSON exports to Teal (fm.teal.alpha.feed.play records on ATProto). It supports smart deduplication, sync mode to skip already-imported records, and automatic rate-limit handling. Available as both a browser-based web app and a Node.js CLI tool. + +## Modes + +- lastfm: Import from a Last.fm CSV export +- spotify: Import from a Spotify data export directory +- combined: Merge Last.fm and Spotify sources +- sync: Skip records already present on the PDS +- deduplicate: Remove duplicate records from the Teal feed + +## Pages + +- /: Landing page and feature overview +- /import: Import tool (ATProto sign-in and file upload) +- /about: Privacy details, CLI usage, rate limit documentation, licence, and credits + +## Privacy + +Runs entirely in the browser. Export files are parsed locally. The only external requests are to Slingshot (ATProto identity resolution) and the user's PDS. No cookies, no local storage, no fingerprinting. + +## Rate limit handling + +Reads ratelimit-* headers from each PDS response, maintains a 15% headroom buffer before the quota ceiling, auto-adjusts batch size (up to 200 records), and respects abort signals immediately. + +## CLI + +Also available as a Node.js CLI. Clone https://github.com/ewanc26/pkgs, install dependencies in packages/malachite, then run `pnpm start`. Supports interactive and command-line modes. + +Key flags: -i (input), -h (handle), -p (app password), -m (mode), -y (skip prompts), --dry-run. + +## Licence + +AGPL-3.0-only + +## Author + +Ewan Croft — https://ewancroft.uk +Support: https://ewancroft.uk/support diff --git a/packages/opal-web/static/llms.txt b/packages/opal-web/static/llms.txt new file mode 100644 index 0000000..27ff126 --- /dev/null +++ b/packages/opal-web/static/llms.txt @@ -0,0 +1,47 @@ +# Opal + +> Convert microblog posts from Twitter, Mastodon, Threads, and Nostr to Bluesky. + +Opal is a free, open-source tool that converts a user's microblog post history from Twitter, Mastodon, Threads, and Nostr to Bluesky (app.bsky.feed.post records on ATProto). Original timestamps are preserved. Available as both a browser-based web app and a Node.js CLI tool. + +## Supported platforms + +- Twitter / X: Tweet archive (tweets.js). Supports tweets, retweets, and quote tweets with facets. +- Mastodon: ActivityPub outbox or CSV export. Supports content warnings, media attachments, and poll metadata. +- Threads: Meta data export. Supports text posts and media attachments. +- Nostr: Kind 1 text note events. + +## What's converted + +Posts with original timestamps, links/mentions/hashtags as facets, media attachments (images), reply threads (where resolvable), content warnings (Mastodon). Not converted: videos, polls, DMs, bookmarks, circle-only posts. + +## Pages + +- /: Landing page and feature overview +- /import: Import tool (OAuth sign-in and file upload) +- /about: Privacy details, supported platforms, OAuth scope, CLI usage, rate limit documentation, licence, and credits + +## OAuth scope + +`atproto transition:generic` + +## Privacy + +Runs entirely in the browser. Export files are processed locally and published directly to the user's PDS. No cookies, no local storage, no fingerprinting. + +## Rate limit handling + +Reads ratelimit-* headers, maintains a 15% headroom buffer, auto-adjusts batch size (up to 200 records), and respects abort signals immediately. + +## CLI + +Also available as a Node.js CLI. Clone https://github.com/ewanc26/pkgs, install dependencies in packages/opal, then run `pnpm start`. Key flags: -i (input), -h (handle), -p (app password), -m (mode: twitter/mastodon/threads/nostr/sync), -y, --dry-run. + +## Licence + +AGPL-3.0-only + +## Author + +Ewan Croft — https://ewancroft.uk +Support: https://ewancroft.uk/support diff --git a/packages/tourmaline/static/llms.txt b/packages/tourmaline/static/llms.txt new file mode 100644 index 0000000..a219e17 --- /dev/null +++ b/packages/tourmaline/static/llms.txt @@ -0,0 +1,47 @@ +# Tourmaline + +> Analyse Teal.fm scrobble history and discover your listener personality. + +Tourmaline is a free, open-source scrobble analyser for Teal.fm (fm.teal.alpha.feed.play records on ATProto). It fetches scrobbles from a user's PDS, computes a listening profile, enriches artist data via MusicBrainz and Last.fm, and assigns a listener personality archetype. No sign-in is required to view a profile; OAuth is only used to share the personality card to Bluesky. + +## What's analysed + +- Top artists, tracks, and albums +- Genre profile (MusicBrainz + Last.fm tags) +- Mood mapping (energetic, melancholic, etc.) +- Listening timeline (365-day heatmap) +- Era preference (decade distribution) +- Diversity score (0–100) +- Obscurity index (0–100) +- Listener personality archetype + +## Pages + +- /: Home — enter an ATProto handle or DID to start analysis +- /profile/[did]: Full listening profile for a given DID +- /share: Share personality card to Bluesky (requires OAuth) +- /about: Privacy details, how it works, what's analysed, licence, and credits + +## How it works + +1. Handle or DID is resolved to a PDS URL via Slingshot. +2. fm.teal.alpha.feed.play records are fetched page-by-page from the PDS. +3. Scrobbles are aggregated server-side into top artists/tracks/albums, genre profiles, mood mapping, era preference, diversity, and obscurity. +4. Top artists are enriched with genre data (MusicBrainz), listener counts and images (Last.fm), and image fallback (Deezer). + +## Privacy + +Analysis runs server-side. Scrobbles are held in an in-memory session (10-minute inactivity timeout, never written to disk). No persistent database. No tracking, no fingerprinting. Reading scrobbles is unauthenticated. + +## External services used + +Slingshot (identity resolution), user PDS (scrobble records), MusicBrainz (genre/tags), Last.fm (listener counts and images), Deezer (image fallback), Bluesky CDN (avatar). + +## Licence + +AGPL-3.0-only + +## Author + +Ewan Croft — https://ewancroft.uk +Support: https://ewancroft.uk/support -- 2.51.2