{"id":50486310,"url":"https://github.com/skullzarmy/cloudnine","last_synced_at":"2026-06-01T22:31:11.438Z","repository":{"id":361339617,"uuid":"1254099351","full_name":"skullzarmy/cloudnine","owner":"skullzarmy","description":"Shopping Tezos art from your Bluesky feed.","archived":false,"fork":false,"pushed_at":"2026-05-30T06:32:43.000Z","size":393,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T08:13:40.311Z","etag":null,"topics":["at-protocol","bluesky","tezos","tezos-blockchain"],"latest_commit_sha":null,"homepage":"https://fafolab.xyz","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/skullzarmy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-30T06:26:49.000Z","updated_at":"2026-05-30T07:11:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/skullzarmy/cloudnine","commit_stats":null,"previous_names":["skullzarmy/cloudnine"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/skullzarmy/cloudnine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skullzarmy%2Fcloudnine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skullzarmy%2Fcloudnine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skullzarmy%2Fcloudnine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skullzarmy%2Fcloudnine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skullzarmy","download_url":"https://codeload.github.com/skullzarmy/cloudnine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skullzarmy%2Fcloudnine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33797126,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["at-protocol","bluesky","tezos","tezos-blockchain"],"created_at":"2026-06-01T22:31:10.519Z","updated_at":"2026-06-01T22:31:11.432Z","avatar_url":"https://github.com/skullzarmy.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cloudnine — buy Tezos NFTs inline on Bluesky\n\n\u003e See a Teia or objkt link in your Bluesky feed? Buy it right there, signed in your wallet, without leaving bsky.app.\n\u003e\n\u003e — a **FAFOlab** joint —\n\nCloudnine is a browser extension that watches your Bluesky feed for links to Tezos NFT marketplaces. When it spots one, it adds a **Buy** (or **Mint**, for open editions) button directly on the post. Click it, connect your Tezos wallet, sign — the NFT is yours and you never left your feed.\n\n## ✨ What it does\n\n- Detects **Teia** (`teia.art/objkt/\u003cid\u003e`) and **objkt.com** (`objkt.com/tokens/\u003ccontract\u003e/\u003cid\u003e`, including named collections like `open_objkt`) links in posts\n- Resolves the cheapest active listing — or an active open edition — for each token\n- Renders an inline **Buy X ꜩ** / **Mint X ꜩ** button on the post\n- Connects your Tezos wallet (Kukai, Temple, Umami, etc.) and builds + broadcasts the purchase itself — no clicking off to the marketplace\n- Post-purchase: a one-tap **Share on Bluesky** that opens the composer pre-filled, plus a local purchase history in the toolbar popup so you can share later\n- Privacy-first: no tracking, no telemetry, no accounts. Settings and history are local-only.\n\n## 🚧 Scope (v0)\n\n- **Bluesky web only.** Native apps and other clients can't be extended; the surface is `bsky.app` in a desktop browser.\n- **Native ꜩ-priced listings only.** Listings priced in other tokens (USDt, etc.) are skipped for now.\n- **No condition-gated listings yet.** Whitelist/allowlist-gated objkt listings are skipped.\n- **Mainnet only.**\n- **Auctions skipped.** English/Dutch auctions live on separate contracts and aren't supported yet.\n\n## ⚠️ Known issues\n\n- **Firefox + web wallets (Kukai):** on Firefox, connecting a **web wallet** like Kukai doesn't work — the Beacon pairing dialog never finishes rendering its \"Use Browser\" action. This is a content-script limitation in the wallet SDK (octez.connect): it hands pairing data to its UI across Firefox's content-script/page compartment boundary, which Firefox blocks (`Permission denied to access property \"then\"`). **Use an extension wallet (Temple) on Firefox.** Chrome is unaffected — all wallets work there. Details + upstream report: [`docs/octez-connect-firefox-issue.md`](docs/octez-connect-firefox-issue.md).\n\n## 📥 Install (dev / load-unpacked)\n\n```bash\ngit clone \u003crepo\u003e\ncd cloudnine\nnpm install\nnpm run build\n```\n\n**Chrome:**\n1. Visit `chrome://extensions/`\n2. Enable **Developer mode** (top right)\n3. **Load unpacked** → select the `dist/` directory\n4. Visit `bsky.app` — Buy buttons appear on posts containing Teia or objkt links\n\n**Firefox:**\n1. Visit `about:debugging` → **This Firefox**\n2. **Load Temporary Add-on** → select `dist/manifest.json`\n\n## 🔧 Using it\n\n1. Scroll your `bsky.app` feed. When a post links a Teia or objkt token, a **Buy X ꜩ** / **Mint X ꜩ** button appears on the post.\n2. Click it — a Cloudnine panel opens with the token, price, and editions.\n3. **Connect** your wallet (first time), then **Buy / Mint**. Approve in your wallet, watch it confirm.\n4. On success, **Share on Bluesky** drops a pre-filled post, or grab it later from the extension popup's purchase history.\n\nThe toolbar popup lets you toggle the extension on/off, see your connected wallet (disconnect there), and review/share past purchases. Wallet connection happens on the post itself — that's the only place a wallet extension can pair with the page.\n\n## 🧱 How it works\n\n```\nURL in a bsky post\n   │  parsers.js   → { source, fa_contract, token_id }\n   ▼\nresolver.js        → cheapest active listing OR active open edition\n   │                 (objkt GraphQL indexes both Teia swaps and objkt listings)\n   ▼\ncontracts.js       → entrypoint + args for that contract\n   │                 (objkt fulfill_ask / Teia collect / open-edition claim)\n   ▼\nbuy-modal.js       → octez.connect (wallet) + Taquito (encode) → on-chain\n```\n\nThe URL only tells us the *token*. objkt's public GraphQL tells us which contract holds the buyable listing (or open edition). A small registry knows how to call each contract.\n\n## 🗂️ Structure\n\n```\nmanifest.json          MV3 manifest (Chrome + Firefox)\nvite.config.js         crxjs build\nsrc/\n├── content/           bsky.app content script, injected styles, in-page buy modal\n├── popup/             toolbar UI (toggle, wallet status, purchase history)\n└── lib/\n    ├── parsers.js     URL → { source, fa_contract, token_id }\n    ├── resolver.js    listing / open-edition lookup (objkt GraphQL + tzkt)\n    ├── contracts.js   marketplace contract registry\n    ├── storage.js     chrome.storage wrappers + purchase history\n    └── format.js      display helpers\n```\n\n## 🛟 Issues\n\nFound a bug or a marketplace URL that should be supported? Open an issue.\n\n## 🔒 Privacy\n\nSee [PRIVACY.md](./PRIVACY.md). Short version: zero telemetry, settings and history are local-only, the extension talks only to the public APIs needed to resolve a listing and broadcast a transaction you signed.\n\n## 📜 License\n\n[The Unlicense](./LICENSE) — public domain. Do whatever you want.\n\n## ❤️ Credits\n\n- Built by **skllzrmy** \u0026 **FAFOlab**\n- Powered by [Taquito](https://tezostaquito.io/) and [octez.connect](https://www.npmjs.com/package/@tezos-x/octez.connect-sdk)\n- Built with [@crxjs/vite-plugin](https://crxjs.dev/vite-plugin)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskullzarmy%2Fcloudnine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskullzarmy%2Fcloudnine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskullzarmy%2Fcloudnine/lists"}