The marketing site for PosPlugin, an integration layer that maps any point-of-sale system to one data model and serves it as one REST API plus webhooks. One page, one stylesheet, one script, served by Cloudflare Pages. No framework, no bundler, no build step, no runtime dependency. It was designed in Claude Design ("PosPlug Landing v2") and ported from its React template to static HTML: every section, the hero patch board, the scroll-driven 30-minute setup and the code samples are in the HTML, and the script only animates them.
PosPlugin is in early access. The product is being built, so:
- The status strip says early access; the first vertical is restaurants.
- The API examples (
api.posplug.in/v1/orders) show the planned shape of the API.llms.txtsays the endpoint is not public yet. - Live pricing is per location, set with early customers. No numbers.
- The early-access form posts to
https://api.posplug.in/v1/waitlist, the Cratefield-harness waitlist Worker inPOSplugin/waitlist-backend, with a Turnstile token (widget site key inassets/posplug.js) andanswers: {company, pos}. With JS off, the form falls back to a mailto tocontact@posplug.in. The Worker mails a double opt-in link, so a join ends on a "Check your inbox" panel (names the address, Spam/Promotions hint, "already confirmed? you're already on the list", "Use a different email"). The API answers the same202whatever the address's state, by design.
When something ships, change it in index.html and llms.txt together.
| Path | What it is |
|---|---|
index.html |
The page: hero patch board, 01 problem, 02 the 30-minute connection, 03 how it works, 04 developers, 05 who it's for, 06 spec sheet, 07 security, 08 pricing, access form |
assets/posplug.css, assets/posplug.js |
The one stylesheet and the one script. The page reads fine with JS off (every setup step is shown, stacked) |
404.html |
Cloudflare Pages serves it for unknown paths, so they return 404 instead of the home page with 200 |
llms.txt, robots.txt, sitemap.xml |
Machine-readable summary (status, how it works, API shape, pricing), crawler rules, sitemap |
COPY.md |
Every claim, caption and credit on the site (including the promo film), with its source |
_headers, _redirects |
Security and cache headers; /github and /source short links |
.well-known/security.txt |
Where to report a vulnerability |
The page head carries the canonical URL, Open Graph and Twitter card tags,
and JSON-LD for Organization, WebSite, SoftwareApplication (with the two
offers) and a short FAQPage. It also links llms.txt as rel="alternate".
| File | Use |
|---|---|
assets/favicon.svg |
The mark: cable, orange plug body, two prongs |
assets/logo-mark.svg |
The mark on a paper tile. Source for the app icons |
assets/icon-512.png, assets/apple-touch-icon.png |
App and home-screen icons |
assets/og.png |
Open Graph and Twitter card, 1200×630 |
assets/readme-banner.png, assets/org-avatar.png, assets/logo.png |
GitHub only: this README, the organisation profile and a transparent lockup. Not published on the site |
The raster files come from the HTML sources in tools/. After changing a source, run:
tools/render-og.sh # headless Chrome; writes every PNG abovePalette: paper #D6D5CF, panel #E4E3DD, ink #141412, signal orange
#FF4F12 (hover #B33600), status green #1FA85A / #3BE37A, warning
yellow #FFC21A. Type: Archivo, condensed with font-stretch (headings,
wordmark), and IBM Plex Mono (everything else). Square corners, 2px ink
borders, hard offset shadows, a 12-column rail grid and film grain.
The footer line on index.html and 404.html names what PosPlugin is built
with, each planned entry marked "(planned)". It comes from the Factory Zero
registry: this venture's uses in Factory-Zero/website assets/fz-data.js,
published as https://factory0.ventures/stack.json and vendored in
tools/built-with.json. tools/built-with.py writes it between the
built-with markers; nothing is fetched at runtime. When the registry
changes, run python3 tools/built-with.py --pull and update the matching
"Built with" section of llms.txt; never edit the strip or the JSON by hand.
python3 tools/built-with.py --check fails if a page is stale.
python3 -m http.server 8787 # serve the repository root; there is nothing to buildMerging to main publishes nothing: the Pages project posplug is
direct-upload. Deploy with:
tools/deploy.sh # builds origin/main in a throwaway worktree and deploys it
tools/deploy.sh --dry-run # builds it and says what would shipNever run tools/build-dist.sh && wrangler pages deploy dist from a working
copy. More than one agent session can share a checkout, and that ships whatever
the working copy holds. build-dist.sh is an explicit allowlist and stamps
content hashes onto the CSS and JS URLs so they can be cached immutably.
Don't request a new /assets/* URL on posplug.in before its deploy has
finished. Pages answers a missing asset with the HTML page, and _headers
tells the edge to cache /assets/*.css and *.js for a year. Probe on
posplug.pages.dev or use a ?cb= query instead.
