React everywhere, without losing the context.
Quoti is a browser extension that transforms social media posts into elegant, shareable context cards.
Instead of posting isolated reactions across platforms, Quoti helps users preserve and transport the original conversation.
Conversations are fragmented across X, Threads, Bluesky, LinkedIn and many other platforms.
Quoti makes conversations portable.
The current MVP is a Chrome Extension built with React, TypeScript, Vite, and Manifest V3.
It supports:
- capturing a visible post on X/Twitter
- capturing a post from the right-click menu
- optionally showing a Quoti button inside supported posts
- normalizing the post into a shared data model
- extracting attached post images and videos
- rendering an Editorial Craft context card
- saving generated cards in a local gallery
- searching and deleting saved gallery cards
- switching the generated card between light and dark themes
- switching the generated card between text-only and media layouts
- downloading the card as PNG or video when source media allows it
- copying the generated image
- copying the source text
- opening the original post when a source URL is available
Everything runs locally in the browser. There is no backend, database, or social API dependency.
Developer documentation lives separately from user installation notes:
- Developer guide
- Frontend architecture
- Mobile app architecture
- Service architecture
- Video rendering roadmap
- Mobile app Phase 3 roadmap
- Shared post contract
Install dependencies:
npm installRun the popup preview:
npm run devBuild the extension:
npm run buildFor the best video export quality, use the native FFmpeg renderer. It lets Quoti render MP4 exports locally through Chrome Native Messaging instead of relying only on the in-extension WASM fallback.
- Download a Windows x64 FFmpeg build.
- Copy
ffmpeg.exeinto this path:
native/quoti-renderer/vendor/ffmpeg/win32-x64/ffmpeg.exe
- Build the extension:
npm run build- Open
chrome://extensions, enable Developer mode, load thedist/folder, then copy the extension ID shown by Chrome. - Register the native renderer for that extension ID:
npm run native:install -- -ExtensionId <extension-id>- Verify that Quoti can find the bundled FFmpeg binary:
npm run native:checkTo remove the native host registration:
npm run native:uninstallThe native renderer does not use FFmpeg from PATH; the binary must be present at the path above.
- Run
npm run build. - Open Chrome.
- Go to
chrome://extensions. - Enable Developer mode.
- Click Load unpacked.
- Select the
dist/folder. - Open
https://x.comorhttps://twitter.com. - Hover a post.
- Click the Quoti extension icon.
- Verify that the popup shows a context card.
- Open the gallery from the popup header and verify the card is saved locally.
- Search the gallery, select one or more cards, and delete them.
- Try Copy image, Download PNG or video, Copy text, Source, Light/Dark, and Text only/With media.
- Right-click a post and choose Create Quoti card.
- Open the extension options from the popup settings button to enable or disable hover capture, right-click capture, and the inline Quoti button.
For local UI-only checks, open the Vite preview at http://localhost:5173/popup.html. Outside Chrome Extension runtime, the popup uses a built-in preview post.