ViewTouch Point of Sale
GNU/Linux Restaurant Point of Sale software - Free and open source POS solution
Film yourself running or climbing. Forma, the vertiqal agent, measures how you move and shops for gear that fits your body, not your keywords.
CommerceTypeScript · JavaScriptGitHub @thisyearnofearOnlineOwner 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.
Film a short clip. An agent measures how you move, confirms the fitting brief with you, checks research and real stock, and hands you a running or climbing shoe recommendation, with receipts.
Footwear is bought on keywords and shop-floor rules of thumb, and it is one of the most-returned categories in commerce. The information that actually matters, how you move, never reaches the checkout.Read the full README ↗Film a short clip. An agent measures how you move, confirms the fitting brief with you, checks research and real stock, and hands you a running or climbing shoe recommendation, with receipts.
Live: vertiqal.vercel.app
Footwear is bought on keywords and shop-floor rules of thumb, and it is one of the most-returned categories in commerce. The information that actually matters, how you move, never reaches the checkout.
vertiqal-brief cookie on this browser, so a returning shopper's sentence is pre-filled — tapping Find my shoes over it is still the confirmation, and a Forget saved answers link clears them. Changing height or the pose provider invalidates a stale measurement.| Service | Role |
|---|---|
| Vercel AI Gateway | Grok 4.7 (agent + vision), Grok TTS (voice), FLUX Kontext (try-on). No per-provider keys. Language-model calls fall back automatically through an ordered chain when the named model isn't reachable on this account (FORMA_AGENT_MODELS / FORMA_FAST_MODELS); see architecture. |
| MediaPipe Pose | On-device keypoints, every frame. |
| VLM Run (Orion) | Optional hosted keypoint refinement on sampled frames of uploaded clips. |
| Tavily | Live retailer, research, community and athlete search. Product search runs at advanced depth and filters out corporate/homepage URLs so picks cite real product pages. |
| Solari | Stealth browser with UK residential egress for size and stock checks, with screenshot and session replay receipts. |
| Browser Use | User-approved basket availability checks (agent tool). |
| Vercel Analytics | Funnel events only — sample_started, film_started, clip_uploaded, measurements_locked, shopping_started, pick_chosen, buy_clicked, shortlist_feedback, limit_hit — carrying sport/retailer flags, no PII. |
| Next.js 16 + AI SDK | App, route handlers, tool-calling agent. |
Thin packaging over the live Fit Passport MCP (directory at chatgpt.com/plugins). Description in user words. Free wedge first: get_fit_passport + check_fit. Live Solari size/stock checks and Fit Passport issuance stay on the product — not in-plugin deep actions. No digital checkout inside ChatGPT (see playbook commerce constraints).
| MCP | https://vertiqal.vercel.app/api/mcp (app/api/mcp · tools get_fit_passport, check_fit) |
| Live app | vertiqal.vercel.app |
| Playbook | docs/CHATGPT_PLUGIN_PLAYBOOK.md |
| Connect | docs/CHATGPT_PLUGIN_CONNECT.md |
| Eval set | docs/CHATGPT_PLUGIN_EVAL.md |
| Starter prompts | docs/CHATGPT_PLUGIN_STARTER_PROMPTS.md |
| Scoreboard | Usage-only funnel (connect → free tool → return) in docs/CHATGPT_PLUGIN_PLAYBOOK.md — usage-first; don’t chase ARPU yet |
| Virality | Hero-frame cards and shareable Fit Passports are the share loop (pick → card → friend → back). Run the K-factor worksheet on shared picks → new fittings, then a 48-hour test on the card CTA. |
There is no revenue path yet; every fitting is free and costs money in model, search and browser calls. The plan — free-stage cost controls first, then affiliate commission on Buy, then B2B fit data once measurement accuracy is validated — lives in docs/monetisation.md.
Accepted into the Keiki × Maritime programme (Oct 20 – Dec 1, 2026): build an always-on personal agent, reach 1,000 users in six weeks. Transparent user tracking starts at zero: docs/KEIKI_MARITIME.md.
pnpm install
pnpm dev # http://localhost:3000
pnpm test:fitting # fitting-state, capture and preference rules
pnpm test:pose # example tracking lifecycle, local export and annotation-comparison unit tests
pnpm smoke # end-to-end checks against BASE_URL (add --llm or --full to exercise the model; --full spends real money)
pnpm cost:report # unit economics from `vercel logs --json` (see script header for price assumptions)
pnpm typecheck # the real type gate: next.config ignores TS errors during build
pnpm build
Forma's movement estimates are experimental. This workflow compares detected foot-contact events against independently supplied annotations; it does not certify biomechanics, shoe fit or clinical validity.
video.currentTime timestamps; do not copy detected contacts into the reference. Explicitly exclude intervals you cannot judge and document why. Mark the annotation set complete only after reviewing the entire evaluation interval.80 ms is an invocation example, not a recommended accuracy threshold.pnpm validate:motion /path/to/capture.json /path/to/annotations.json --tolerance-ms 80
Annotation template (replace the capture id and interval with values from your export, fill contacts, then set complete to true):
{
"schemaVersion": 1,
"captureId": "replace-with-exported-captureId",
"source": "manual",
"referenceNotes": "Describe how contact frames were independently reviewed and any timing uncertainty.",
"complete": false,
"interval": { "startSec": 0, "endSec": 10 },
"excludedIntervals": [],
"contacts": []
}
Each contact is { "timeSec": <number>, "side": "left" | "right" }. Each exclusion is { "startSec": <number>, "endSec": <number>, "reason": <string> }; its endpoints are inclusive. The CLI refuses incomplete annotations, mismatched capture ids, invalid timelines, duplicate contacts and resource-truncated captures. Matching is one-to-one and same-side: maximise the number of contacts within the supplied window, then minimise total absolute timing error. Reports include precision/recall with explicit counts, misses, extra detections, timing errors and processed-frame visibility counts. An empty denominator is null, not perfect accuracy. Source declarations are not independently verified; synthetic and unclassified captures are labelled debug-only. There is no accuracy pass/fail threshold or aggregate leaderboard.
The recorder retains the first continuous segment and stops on rewind or dimensions changes. It records all frames actually processed by Forma, not every source-video frame; visibility counts are frame counts, not elapsed-time coverage. Resource caps are 18,000 processed frames and 2,000 contacts, with no subsampling; a cap-stopped export is marked truncated and refused by the comparison tool. Live capture exports no video, so uploaded clips are preferable for independent annotation. Height, provider, sport or clip changes discard the in-memory trace. The provider identifier records the selected mode, not per-frame backend provenance; the optional hosted mode may fall back to MediaPipe.
Use FreeMoCap as a separate offline reference workflow, not a runtime dependency. Its multi-camera guide describes calibrated, overlapping camera views. Capture the same real movement simultaneously and compare a single-view Forma export against independently reviewed reference events; align timestamps and record calibration/synchronisation quality. Such annotations may use source: "calibrated-multicamera" with those details in referenceNotes. Native FreeMoCap files are not directly imported by this CLI, and FreeMoCap itself is not automatically ground truth. Review its AGPL-3.0 licensing before incorporating software; review recording/data permissions separately. A single-camera 3D-shaped export is not proof of measured depth.
Pending: no consented human dataset, manual-reference results or calibrated multi-camera comparison has been completed. The automated tests exercise synthetic code fixtures only. Do not present their passing results as motion-capture accuracy evidence.
The six-stage walkthrough is an illustrated journey, not a genuine recorded fitting.
public/examples/generated-runner.mp4, produced once with Seedance 1.5 Pro on fal.ai (fal lists the model for commercial use). Full generation details — request id, seed, input and media metadata — ship with the app at public/examples/generated-runner-provenance.json. The runner is synthetic and is not a real person; a local pose overlay observes the generated frames (at most 12 fps while the clip plays), and the overlay pauses when it is switched off, the panel leaves the viewport or the tab is hidden. The clip itself pauses when hidden or scrolled out of view and stays paused until the user resumes it; playback is independent of walkthrough progression. The fitting metrics remain fixtures and no real-person accuracy is established.Template — not a completed stock check — it shows what a real check reports, it does not simulate a verdict. The climbing example uses an inline illustration, not footage.public/ so it only costs ordinary CDN bandwidth per visitor — there is no paid call per view. One generation was approved and run once; the recorded figure ($0.31104) is a preflight unit-price estimate, not an actual billed amount. FAL_KEY lives server-only in .env.local (mode 600) and was needed solely to author the asset — the demo does not depend on fal at runtime. Genuine saved research and stock outputs still require further assets and live verification.public/examples/archival-runner.mp4 — a 3-second clip (7:55–7:58) from Orientation to Physical Efficiency Battery (1986), Federal Law Enforcement Training Center, via the Moving Image Archive and originally published on the Internet Archive, labelled public domain by both archives.lib/fitting/example.ts (EXAMPLE_FOOTAGE).Automated checks last run 2026-11-02: pnpm typecheck clean, pnpm test:fitting 60/60, pnpm test:pose 34/34, pnpm build clean, git diff --check clean. Manual browser checklist still pending: desktop/mobile dock overlap and scrolling plus settings sheet; example play/pause, overlay toggle, tab hide and scroll-away behaviour; closing the example restores action-button focus, and camera setup focuses the height field; running and climbing upload and capture countdown. The synthetic examples do not establish measurement accuracy; genuine footage, research and stock evidence, calibrated comparison and revenue validation remain separate pending workstreams.
The stock-check browser work in lib/agent/solari.ts was reviewed against the pinned Solari cookbook examples:
/api/stock-check/replay) match the documented configuration/lifecycle.lib/agent/stock-page.ts was newly adapted from this example: after navigation, the final URL, HTTP status, h1 identity, structured Product names and size controls are checked before the model judge is allowed to interpret the page. In-flight navigation to disallowed hosts is aborted via request routing, and a refused redirect invalidates the whole read.These patterns were reviewed and adapted; this project is not a cookbook fork, and the earlier stealth/recording implementation was not originally derived from it.
Verification and limits: inspectStockPage in lib/agent/stock-page.ts is a conservative heuristic — matching headings provide identity evidence, not proof of product correctness or stock, and navigation, screenshot and replay evidence prove execution happened, not the verdict. The identity check can refuse a real product page (conservative by design) rather than assert stock on the wrong one. Tests cover the pure gate and a mock judge; the navigation/redirect interception has no live or browser QA yet. See lib/fitting/fitting.test.ts for the covered cases. Live end-to-end verification through the paid Solari API has not yet been run, and rate limits and caches are per-instance.
| Path | What it is |
|---|---|
app/page.tsx | Entry point; renders the Stride Lab. |
app/api/ | Route handlers (see architecture). Thin: parse, call lib/, respond. |
components/stride-lab/ | Fitting bench: header, synthetic example, brief form, camera/video stage, pose overlay and readouts. |
components/stride-lab/agent/ | Agent conversation, depth dial, picks, explicit stock checks, basket checks, Fit Passport UI. |
components/stride-lab/hero/ | Hero frame card and try-on UI. |
components/stride-lab/twin/ | Interactive 3D Movement Twin (Three.js WebGL rig, 3D biomechanical vectors, agent fit pins, and 3D snapshot export). |
components/forma/ | Forma avatar and console personalisation. |
lib/fitting/ | Client-side fitting rules: stage flow, preference validation, example scripts, stock-size and camera-stream semantics. |
lib/pose/ | Pose provider contract (MediaPipe, VLM Run) and 3D Movement Twin retargeting (lib/pose/twin-3d.ts). |
lib/metrics/ | Sport-specific measurements and readouts. |
lib/agent/ | Gear agent, tools, evidence checks, and the Tavily, Browser Use and Solari clients. |
lib/hero/ | Hero frame scoring and capture. |
lib/passport/ | Passport schema, signing and fit checks. |
lib/rate-limit.ts | Per-visitor daily limits, global daily route budgets and instant feature switches (FORMA_DISABLED_FEATURES). Counters live in Redis when KV_REST_API_URL/UPSTASH_REDIS_REST_URL is set (lib/rate-limit/store.ts), else per instance. |
lib/secrets.ts | requireSecret / MissingSecretError: signing secrets are required, never borrowed from a vendor key. |
Business rules live in lib/; components and routes stay thin. See docs/architecture.md for the request flow and extension points.
Server-side only (Vercel Vars or an uncommitted .env.local). Never expose these as NEXT_PUBLIC_*.
| Variable | Used for | Without it |
|---|---|---|
TAVILY_API_KEY | Live search tools | Agent skips live research and stock |
BROWSER_USE_API_KEY | Basket checks | Basket check unavailable |
SOLARI_API_KEY | Stock checks and session replays | Check my size returns an error |
STOCK_CHECK_SECRET | Required. Signing secret for stock-check product targets (openssl rand -base64 32) | Size checks return 503; picks carry no stock token |
STOCK_CHECK_EXTRA_HOSTS | Comma-separated extra approved retailer hosts (optional) | Built-in footwear retailer list only |
PASSPORT_SECRET | Required. Signing secret for Fit Passports (openssl rand -base64 32). Never reuses a vendor key | Passport issue/read returns 503 (demo passports still work) |
FORMA_LLM_BASE_URL, FORMA_LLM_API_KEY, FORMA_LLM_MODEL | Any OpenAI-compatible provider (xAI https://api.x.ai/v1, OpenAI, Groq, Together, OpenRouter, a local Ollama/vLLM…). When all three are set it is tried first; optional FORMA_LLM_NAME labels it | Gateway only |
AI_GATEWAY_API_KEY | Vercel AI Gateway (needs a positive credit balance; 402 otherwise). Set FORMA_DISABLE_GATEWAY=1 to skip it | Gateway candidates are skipped |
FORMA_AGENT_MODELS, FORMA_FAST_MODELS | Ordered fallback chains, e.g. compatible:grok-4,gateway:openai/gpt-5-mini (bare ids mean the gateway) | Built-in gateway chains |
KV_REST_API_URL, KV_REST_API_TOKEN (or UPSTASH_REDIS_REST_*) | Shared rate-limit counters so daily caps hold across serverless instances | Per-instance counters (warned at startup) |
ERROR_WEBHOOK_URL | Slack/Discord-style incoming webhook that receives one line per unhandled server error (instrumentation.ts); errors are always logged too (optional) | Logs only |
VLMRUN_API_KEY |
Without any model provider configured, every LLM-backed route returns 503 and measurement still works on-device.
lib/agent/models.ts | Provider-aware model resolution: an OpenAI-compatible provider (FORMA_LLM_*) first, Vercel AI Gateway as fallback. |
| VLM Run pose refinement |
| Provider falls back to MediaPipe only |
FORMA_DISABLED_FEATURES | Comma-separated kill-switch for paid surfaces (agent, deep, tryon, vision, brief, voice, pose-vlmrun, passport-fit) (optional) | All configured surfaces enabled |
FORMA_BUDGET_<SURFACE> | Global daily call budget per surface, e.g. FORMA_BUDGET_TRYON=60 (optional) | Uses built-in daily defaults in lib/rate-limit.ts |
FORMA_VISITOR_LIMIT_<SURFACE> | Per-visitor daily call limit per surface, e.g. FORMA_VISITOR_LIMIT_AGENT=6 (optional) | Uses built-in visitor defaults in lib/rate-limit.ts |