https://github.com/skullzarmy/cloudnine
Shopping Tezos art from your Bluesky feed.
https://github.com/skullzarmy/cloudnine
at-protocol bluesky tezos tezos-blockchain
Last synced: 1 day ago
JSON representation
Shopping Tezos art from your Bluesky feed.
- Host: GitHub
- URL: https://github.com/skullzarmy/cloudnine
- Owner: skullzarmy
- License: unlicense
- Created: 2026-05-30T06:26:49.000Z (4 days ago)
- Default Branch: main
- Last Pushed: 2026-05-30T06:32:43.000Z (4 days ago)
- Last Synced: 2026-05-30T08:13:40.311Z (4 days ago)
- Topics: at-protocol, bluesky, tezos, tezos-blockchain
- Language: JavaScript
- Homepage: https://fafolab.xyz
- Size: 384 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Cloudnine — buy Tezos NFTs inline on Bluesky
> See a Teia or objkt link in your Bluesky feed? Buy it right there, signed in your wallet, without leaving bsky.app.
>
> — a **FAFOlab** joint —
Cloudnine 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.
## ✨ What it does
- Detects **Teia** (`teia.art/objkt/`) and **objkt.com** (`objkt.com/tokens//`, including named collections like `open_objkt`) links in posts
- Resolves the cheapest active listing — or an active open edition — for each token
- Renders an inline **Buy X ꜩ** / **Mint X ꜩ** button on the post
- Connects your Tezos wallet (Kukai, Temple, Umami, etc.) and builds + broadcasts the purchase itself — no clicking off to the marketplace
- 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
- Privacy-first: no tracking, no telemetry, no accounts. Settings and history are local-only.
## 🚧 Scope (v0)
- **Bluesky web only.** Native apps and other clients can't be extended; the surface is `bsky.app` in a desktop browser.
- **Native ꜩ-priced listings only.** Listings priced in other tokens (USDt, etc.) are skipped for now.
- **No condition-gated listings yet.** Whitelist/allowlist-gated objkt listings are skipped.
- **Mainnet only.**
- **Auctions skipped.** English/Dutch auctions live on separate contracts and aren't supported yet.
## ⚠️ Known issues
- **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).
## 📥 Install (dev / load-unpacked)
```bash
git clone
cd cloudnine
npm install
npm run build
```
**Chrome:**
1. Visit `chrome://extensions/`
2. Enable **Developer mode** (top right)
3. **Load unpacked** → select the `dist/` directory
4. Visit `bsky.app` — Buy buttons appear on posts containing Teia or objkt links
**Firefox:**
1. Visit `about:debugging` → **This Firefox**
2. **Load Temporary Add-on** → select `dist/manifest.json`
## 🔧 Using it
1. Scroll your `bsky.app` feed. When a post links a Teia or objkt token, a **Buy X ꜩ** / **Mint X ꜩ** button appears on the post.
2. Click it — a Cloudnine panel opens with the token, price, and editions.
3. **Connect** your wallet (first time), then **Buy / Mint**. Approve in your wallet, watch it confirm.
4. On success, **Share on Bluesky** drops a pre-filled post, or grab it later from the extension popup's purchase history.
The 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.
## 🧱 How it works
```
URL in a bsky post
│ parsers.js → { source, fa_contract, token_id }
▼
resolver.js → cheapest active listing OR active open edition
│ (objkt GraphQL indexes both Teia swaps and objkt listings)
▼
contracts.js → entrypoint + args for that contract
│ (objkt fulfill_ask / Teia collect / open-edition claim)
▼
buy-modal.js → octez.connect (wallet) + Taquito (encode) → on-chain
```
The 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.
## 🗂️ Structure
```
manifest.json MV3 manifest (Chrome + Firefox)
vite.config.js crxjs build
src/
├── content/ bsky.app content script, injected styles, in-page buy modal
├── popup/ toolbar UI (toggle, wallet status, purchase history)
└── lib/
├── parsers.js URL → { source, fa_contract, token_id }
├── resolver.js listing / open-edition lookup (objkt GraphQL + tzkt)
├── contracts.js marketplace contract registry
├── storage.js chrome.storage wrappers + purchase history
└── format.js display helpers
```
## 🛟 Issues
Found a bug or a marketplace URL that should be supported? Open an issue.
## 🔒 Privacy
See [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.
## 📜 License
[The Unlicense](./LICENSE) — public domain. Do whatever you want.
## ❤️ Credits
- Built by **skllzrmy** & **FAFOlab**
- Powered by [Taquito](https://tezostaquito.io/) and [octez.connect](https://www.npmjs.com/package/@tezos-x/octez.connect-sdk)
- Built with [@crxjs/vite-plugin](https://crxjs.dev/vite-plugin)