尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
*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.檢視完整 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