commit 9b09f149165d69c1126ef5447a710a95037d76c8 Author: scot Date: Sat Jul 18 05:17:45 2026 +0000 v0.1.0-alpha: interactive demo platform core - Fastify API: demos/steps CRUD, content-addressed assets, scoped API keys (read/author/publish/admin, draft-only default per D4) - Player: image + sandboxed DOM steps, hotspots, tooltips, keyboard nav, privacy-first beacons (no IP storage, viewer tokens only — R7) - Editor: React SPA — demo list, drag-to-draw hotspots, annotations, publish - MCP server: Streamable HTTP, scope-filtered tools, untrusted-data wrapping on viewer-supplied content (R8); platform never calls a model - Capture extension (MV3): screenshot-flow recording, hotspots pre-placed from real clicks - Docker: single app image + postgres, Traefik-ready (expose only) E2E verified: capture->author->publish->play->beacon->lead->analytics + full MCP tool surface with scope filtering. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b38b416 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +apps/api/public/editor/ +data/ +*.log +.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4136310 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +# Version: 0.1.0 +FROM node:22-alpine AS build +WORKDIR /app +COPY package.json ./ +COPY apps/api/package.json apps/api/ +COPY apps/editor/package.json apps/editor/ +RUN npm install --workspaces --include-workspace-root +COPY tsconfig.base.json ./ +COPY apps ./apps +RUN npm run build -w apps/editor && npm run build -w apps/api + +FROM node:22-alpine +WORKDIR /app +ENV NODE_ENV=production +COPY package.json ./ +COPY apps/api/package.json apps/api/ +RUN npm install --omit=dev -w apps/api --include-workspace-root=false && npm cache clean --force +COPY --from=build /app/apps/api/dist apps/api/dist +COPY --from=build /app/apps/api/public apps/api/public +COPY apps/api/src/migrations apps/api/dist/migrations +EXPOSE 3000 +CMD ["node", "apps/api/dist/index.js"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b684b9f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 DiligenceWorks Pte. Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e433ed7 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# Demo Platform (working name) + +Self-hosted, open-source interactive demo platform. One capture → interactive +clickable demo, step-by-step guide, narrated video. MIT licensed, built and +owned by DiligenceWorks Pte. Ltd. + +**Status: v0.1 — early alpha.** Interactive demos (image steps) work end to end: +capture with the browser extension → refine in the editor → publish → share/embed. + +## Why + +The interactive-demo SaaS category (Arcade, Storylane, Navattic, Supademo) is +closed-source and $500–1,200/mo, and your demos — unreleased UI, prospect +analytics, lead data — live in someone else's cloud. This runs on your +infrastructure. Nothing leaves it. + +## AI without a bundled model + +The platform **never calls an LLM**. It ships an **MCP server** (`POST /mcp`, +Streamable HTTP): attach your own agent — Claude, an IDE, your own runtime — +with a scoped API key, and it can list demos, write annotations, place +hotspots, reorder steps, read analytics, and (only with an explicitly granted +`publish` scope) publish. Draft-only by default; the human decides who may +publish. Viewer-supplied data (leads) is wrapped in untrusted-data markers. + +## Quick start + +```bash +docker compose up -d --build +docker compose logs app | grep -A2 "FIRST RUN" # your admin API key, shown once +``` + +Open `/editor`, paste the key. Create a demo, upload screenshots as steps (or +install `extension/` as an unpacked Chrome extension and record a real +click-through — hotspots are pre-placed from your actual clicks), drag hotspots, +write tooltips, publish. Share `/p/`, embed with an `