Doop
Doop is an open-source multiplayer design canvas and design MCP for Claude Code, Codex, and any AI agent. Design side by side with agents — free in beta.
Tell us your name and get your own Ember.
DesignJavaScript · CSSGitHub @aerawat-foundryOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
*Humankind's great tech began with fire. This this.side.of.tech is You.*
A generator and scanner for Ember codes: posters where a standard QR code
burns at the base of a grid column and rises as a plume of embers.Read the full README ↗Humankind's great tech began with fire. This
this.side.of.techis You.
A generator and scanner for Ember codes: posters where a standard QR code burns at the base of a grid column and rises as a plume of embers.
| URL | What it does |
|---|---|
/ | Home. Asks for your name, then takes you to your own Ember. |
/ember/<code> | Your Ember. An Ember QR poster whose QR leads back to https://thissideoftech.com/ember/<code>. The 8-character code comes from a hash of the name (same name, same code; case and spacing ignored; the name can't be recovered from it). The name itself stays on the device that entered it. Anyone else sees the poster without the name. Share, copy link, PNG/SVG download, plus an in-page check that the poster scans back to its link. |
/generate/ | Generator. Type text, get the poster as SVG or PNG. Optional hidden ember text, plus an X-ray view of the convention. |
/qr/ | Ember QR. A standard QR drawn as the embers: a column of grid cells opening into a plume of embers, with ash where the code has no embers. Spare data bits are solved for the picture (zero errors), and an adjustable share of the error-correction budget ("burn") pulls more modules into shape. Settings: size, error-correction level, burn, timing/alignment styling, x-ray. Each design is decoded in the page before you download it. Any QR reader can scan the result; it has no ember layer. |
/scan/ | Scanner. Opens straight to the camera, with a gallery icon to scan a saved image (paste and drag-and-drop work too). A Standard QR / Ember QR switch picks the mode: Standard reads only the QR; Ember also reads the ember layer (pooling evidence across camera frames) and checks the hotpoints. ?mode=standard or ?mode=ember preselects it. |
npm install
npm run dev # http://localhost:5173/ (and /generate/, /qr/, /scan/, /ember/<code>)
npm run dev:phone # same, over HTTPS on your network (self-signed), to test the camera on a phone
npm run build # static site in dist/, served from the domain root
npm test
base: '/'), because pages are opened from deep links such as /ember/<code>./ember/<code> must serve ember/index.html. That rule is already included for Netlify and Cloudflare Pages (public/_redirects), for Vercel (vercel.json), and for npm run dev / preview. On another host, add the same rewrite.https://thissideoftech.com, even when the page is opened on localhost or a preview deploy. Set VITE_SITE_ORIGIN at build time to use another address.Every poster page (the Ember page, Ember QR and the generator) has a designer. The poster is a 2:3 page with a text block above the ember, the ember itself, and a text block below.
d=, base64url JSON) and is validated when read.Text is laid out by src/core/richtext.js:
src/core/compose.js.Fonts: Momo Trust Display (default), Archivo Black, Anton, Bricolage Grotesque, Space Grotesk, Fraunces and DM Serif Display. All are from Google Fonts under the SIL Open Font License 1.1 (src/assets/fonts/licenses/). Each loads on demand (the Latin subset, 13–25 KB) and is embedded in the poster, so downloaded SVGs and PNGs keep their type. Letters outside Latin are drawn in a fallback font.
The build includes a web app manifest and a service worker (sw.js,
generated with the exact list of built files). The app installs to the home
screen and opens straight to the scanner. After the first visit both pages,
including the ZXing WebAssembly, work offline. Use the Install button in the
generator header or the scanner's top bar. On iPhone, use Share ▸ Add to Home Screen.
The scanner opens the camera by itself only when permission is already granted. Otherwise it shows Enable camera, and that tap opens the browser's permission dialog: browsers show the dialog reliably only in response to a tap. If the camera was blocked earlier, browsers never ask again, so the scanner shows how to re-allow it on iPhone, Android or desktop.
The dialog also never appears on plain http:// (except localhost) or
inside another site's frame. Use HTTPS (npm run dev:phone for local testing).
The camera needs a secure context (HTTPS or localhost) and its own tab: pages embedded in another site's frame are not allowed to use the camera, and the scanner says so and offers to open in a new tab.
The end-to-end tests rasterize and distort posters with Python:
pip install cairosvg opencv-python-headless numpy. Those tests are skipped
when Python is missing.
src/core/ convention + rendering + scanning (no DOM; runs in Node too)
prng.js SHA-256 counter stream used for every convention choice
rs.js Reed-Solomon GF(256) with error + erasure decoding
qr.js standard QR matrix (qrcode-generator) + function-pattern mask
artqr.js art QR encoder: free-bit solving (QArt) + error-budget "burn"
emberqr.js Ember QR picture (column + plume) and renderer
ember.js ember layout and codec
hotpoints.js hotpoint placement
render.js poster SVG
scan.js ZXing (WebAssembly) + grid refinement + ember / hotpoint reading
src/app/ the two pages, plus pwa.js (install + service worker registration)
src/sw-template.js service worker; vite.config.js fills in the precache list
public/ manifest and app icons
tests/ unit tests and render → distort → scan tests