>_APP STORE โ DOCS
A dependency-free static storefront for the MenkeTechnologies stack, built on the stryke HUD design system and deployed on GitHub Pages. One JavaScript catalog drives the grid, product pages, cart, and checkout.
Overview
The store is pure static HTML, CSS, and vanilla JavaScript โ no build step, no framework, no backend. It serves three pages over one shared catalog and design system:
- index.html โ storefront: hero, search, category filters, product grid.
- product.html โ product detail (reads
?id=): overview, features, pricing, buy/download. - checkout.html โ Shopify-style checkout: express wallets, card form, billing, order summary.
All three load store.js (logic + catalog), store.css (commerce surfaces), and the vendored HUD assets hud-static.css / tutorial.css / hud-theme.js.
Architecture
store.js is a single IIFE. On DOMContentLoaded it renders whatever mount points the current page exposes and guards out the rest, so the same script is safe on every page:
#productGrid→ the storefront grid + filters + stats#detailRoot→ the product detail page (from?id=)#checkoutRoot→ the checkout page (reads the cart)#cartCount/#modalOverlay→ cart badge + modal, on any page
The cart lives in localStorage under appstore-cart; theme / CRT / neon / color-scheme preferences under the appstore-hud-* keys.
Catalog model
The PRODUCTS array in store.js is the single source of truth. Three construction styles keep it DRY:
- Explicit objects โ the apps, audio plugins, and CLI tools, each with distinct copy.
strykePkg(id, glyph, desc)โ generates the 30 near-identical stryke-ecosystem packages from a compact table.metaProduct(id, glyph, category, tagline, pills, hasRelease)โ generates the remaining MenkeTechnologies repos (zsh plugins, dev tools).
Long-form copy (an overview paragraph and a rich features list) lives in the DETAILS map, ported from each repo's README / source, and is merged into PRODUCTS at load. Cards, search, filters, and the stat counters above are all derived โ no hardcoded counts.
To add a product: append one object or one table row, and optionally a DETAILS entry. Everything else updates automatically.
Catalog families
The catalog spans eight display categories. Counts below are a snapshot of the current PRODUCTS array; the live hero counters at the top of this page reflect the running catalog.
- Desktop Apps (18) โ the Rust/Tauri v2 app suite:
zpdf,zphoto,zemail,zoffice,audio haxor,traderview,ztranslator,zcite,zreq,ztunnel,zthrottle,zgo,zftp,zcontainer,zterminal,zpwr-daw, andzstation(17 paid, proprietary โ none link a public Source), pluszwire, the free / OSS Chromium-superset browser. - Audio Plugins (3, paid) โ
zpwr-synth,zpwr-fx,zpwr-midi-fx: a fully-modular JUCE plugin trio shipping VST3 / AU / CLAP / Standalone. Each carriesdocs[]entries pointing at its own per-plugin block catalog PDF plus the shared fullzpwr-patch-core-block-catalog.pdf, instead of a GitHub Pages site. - Developer Tools (12, free) โ the flagships
zshrsandstryke, plusvimlrs,elisprs,zmax,zmax-gui,fusevm,api-rest-generator,LearningCollectionAPI,stryke-demo,VimColorSchemes, andgh_reveal. - CLI Tools (12, free) โ
awkrs,lsofrs,nmaprs,iftoprs,htoprs,grcrs,temprs,powerliners,ztmux,storageshower,zpwrchrome,zwire-host. - Editor Plugins (11, free) โ VS Code, Vim/Neovim, and Emacs support for the in-house languages (
stryke,zshrs,awkrs), pluszpwr-themeandtmux-fzf-url. - stryke Packages (30, free, generated) โ the
stryke-*ecosystem (databases, clouds, data formats, automation), each built bystrykePkg()from a compact[id, glyph, desc]row. - Zsh Plugins (20, free, generated) โ
zpwr,zsh-more-completions,zsh-expand, and the rest of the zsh-plugin family, built bymetaProduct(). - Publications (19, paid) โ the companion books and collections:
the-stack,the-compiled-mind,the-waking-fleet,the-inheritors, thestrykelang,zshrs,zmax,fusevm,elisprs,awkrs,vimlrs,zterminal,powerliners,ztmux, andzwirebooks, Rewriting the Desktop in Rust, The CLI Fleet (the command-line-tool compendium), Firsts (the invention ledger), and thezpwr-encyclopedia.
Total: 125 products across 8 categories โ 39 paid, 86 free / OSS. Third-party forks mirrored in the org (fzf-tab, zsh-z, zunit, etc.) are intentionally excluded to avoid misattributing authorship.
Documentation links
Repos that publish their docs/ to GitHub Pages are listed in the DOC_REPOS array (57 ids). For each, the detail page's Documentation section renders doc-cards built at load:
- Documentation →
menketechnologies.github.io/<id>/ - Engineering Report →
<base>/report.html - API Reference →
<base>/reference.html, only for the ids inDOC_REFERENCE:strykelangandzshrs.
Products with no published Pages site (the proprietary apps, and the Pages-disabled audio plugins that ship a PDF catalog instead) are omitted so no Docs link 404s. A shipped reference PDF still renders alongside the HTML doc-cards via the product's docs[] array.
Screenshots & lightbox
GUI products (the desktop apps and audio plugins) carry a screenshots array in their DETAILS entry โ [{ src, cap }]. When present:
- the grid card and the detail hero render the first screenshot instead of the letter glyph (products with no
screenshotskeep the glyph); - the detail page renders a Screenshots gallery when there is more than one shot;
- any image (hero or thumbnail) opens a keyboard-navigable lightbox โ
←/→to step,Escto close.
Images live under assets/ (one folder per multi-shot product). Captures are downsized to ≤1600 px and converted to WebP (cwebp -q 82). A test asserts every referenced asset exists on disk, is WebP, and is size-budgeted, with no orphans.
Discount codes
Codes live in the DISCOUNTS map in store.js and apply at checkout. Two ship by default:
LAUNCH20โ 20% off the subtotal (percent).HUD10โ $10 off the subtotal (flat).
A discount never exceeds the subtotal โ discountAmount() clamps with Math.min. Add a code by appending an entry of the form { type: 'pct' | 'flat', value, label }.
Editing the catalog
Everything is data-driven from store.js:
- Add a product โ append an explicit object to
PRODUCTS, or a row to thestrykePkg/metaProducttables. Setprice: 0(or a$0first tier) for free; givetiersfor paid. - Change a price โ edit the product's
tiers(the first tier sets the card price). - Add rich copy โ add a
DETAILSentry with anoverviewand afeatureslist; it merges into the product at load. - Add screenshots โ drop WebP files in
assets/and list them in the product'sscreenshotsarray. - Publish docs โ add the id to
DOC_REPOS(and toDOC_REFERENCEif it shipsreference.html).
Troubleshooting
- Hero counters show "โ". The stat spans are filled by
store.js; if it failed to load, the dashes stay. Check the console and confirm../store.jsresolves from the page's path. - A Docs button 404s. The id is in
DOC_REPOSbut its GitHub Pages site is not published; remove the id or enable Pages on that repo. - A download link is dead. Free products link
releases/latestwhenhasReleaseis true, else the repo's/tagspage โ flip the flag to match the repo's actual release state. - Theme / scheme doesn't persist. Preferences are stored under the
appstore-hud-*localStoragekeys; private-browsing or cleared storage resets them to defaults.
Free vs paid & download targets
A product is free when its first tier price is 0 (the isFree helper). The two paths:
- Free → a Download button. If the repo has a GitHub release it links to
releases/latest; if not, it links to the repo's/tagspage (per-tag source archives). - Paid → Add to cart with a license-tier picker, routed through the checkout.
Third-party forks mirrored in the org are intentionally excluded from the catalog โ they are not MenkeTechnologies products. Proprietary paid products omit the "Source" link because their repos are private.
Pricing model
Paid products are licensed per major version, not as a one-time purchase. Each sale licenses the current major version including all minor and patch updates within it; a future major version is a separate purchase. Cards show a per major version label and the detail page states the policy explicitly.
Checkout
checkout.html mirrors the Shopify hosted-checkout layout in the HUD theme: express wallet buttons (Shop Pay, PayPal, Google Pay, Venmo), a credit-card / Shop Pay / PayPal method accordion, contact + billing forms, discount codes (DISCOUNTS map), and a sticky order summary.
Note Payments are a client-side placeholder โ completeOrder() simulates a confirmed order; no real charge happens. Wire each method to Shopify (redirect), PayPal Smart Buttons, or Stripe before going live. Integration points are marked INTEGRATION HOOKS: in wireCheckoutPage().
Design system
The store vendors the stryke docs HUD system verbatim, so the store and the docs share one visual language: Orbitron + Share Tech Mono, CRT scanline overlays, neon border pulse, and five swappable color schemes (Cyberpunk, Midnight, Matrix, Ember, Arctic) plus a light/dark toggle. Everything resolves from CSS variables, so a scheme switch recolors the entire store. store.css adds only the commerce surfaces โ no new colors.
Hosting
Served from GitHub Pages (branch main, root) at menketechnologies.github.io/app-store. Because it is a pure static site, there is no build or deploy step โ a push to main updates the live site. Pages requires a public repo on the free plan.
Tests & CI
A dependency-free node:test suite (test/store.test.js) loads store.js into a minimal DOM shim and asserts on the rendered HTML โ catalog size and unique ids, free-vs-paid download wiring, per-major-version pricing copy, every detail page having an overview and rich features, checkout totals, and HTML asset references. Run it with node --test.
.github/workflows/ci.yml runs node --check on the JavaScript, the test suite, and an HTML sanity check on every push and pull request.