Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
One tap opens your business profile: services, contact details, socials and a one-tap call or save contact. Works on iPhone and Android, no app needed.
BusinessTypeScript · CSSGitHub @EdzZ29OnlineOwner 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
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Next.js 16 (App Router) + React 19 + Tailwind CSS 4. The admin dashboard and the public NFC profile pages for TapAccess. All data comes from the TapAccess API.
npm install
cp .env.example .env.local
npm run dev # http://localhost:3001 (the API must be running on :4000)
| Variable | Exposed to browser | Purpose |
|---|---|---|
API_URL | no | Where the Next.js server and the /api + /uploads rewrites reach the API |
INTERNAL_API_KEY | no | Required in production. Must match the API's INTERNAL_API_KEY; lets the API trust the visitor IP forwarded by the Save contact / tracking route handlers |
SESSION_COOKIE_NAME | no | Must match the API's COOKIE_NAME (default tapaccess_session) |
NEXT_PUBLIC_SITE_URL | yes | Public base URL. Card URLs are <SITE_URL>/c/<slug>, so set your final domain before writing any NFC tags |
No secret is ever prefixed NEXT_PUBLIC_. The admin session cookie is
HttpOnly and set by the API through the same-origin /api rewrite, so
JavaScript never sees it.
| Route | Rendering | |
|---|---|---|
/ | static | Neutral landing page (does not link to the dashboard) |
/c/[slug] | dynamic SSR, no-store | Public profile; loading, error, not-found and unavailable states; Open Graph + theme-colour metadata |
/login | client | Admin sign-in; ?next= is restricted to /admin… paths |
/admin | client | Overview: stat tiles, visits over time, top and recent cards |
/admin/cards | client | Search, filter by status/package, sort, paginate, row actions |
/admin/cards/new | client | Create a card (live slug availability, package picker) |
/admin/cards/[id] | client | NFC setup (URL, QR, NFC Tools steps), details, analytics |
/admin/cards/[id]/edit | client | Visual editor with live phone preview |
/admin/settings | client | Display name, change password |
proxy.ts redirects signed-out visitors from /admin/* to /login. This is
only a UX shortcut: the API verifies the session on every request.
app/ routes (see above)
components/
profile/ public card renderer, shared by /c/[slug] and the editor preview
profile-view.tsx hero, quick actions, Save contact / Share
profile-sections.tsx about, buttons, contact, hours, services, products, promotions, gallery…
theme.ts theme → CSS variables and button styles
tracking.tsx visit/click beacons (no cookies, no storage)
admin/ dashboard shell, charts, card actions, packages, editor/
ui/ button, fields, dialog, confirm, menu, badges, feedback
lib/
api.ts browser API client (same-origin /api)
server-api.ts server-only public profile fetch
plans.ts package rules (mirror of the API's)
constants.ts, types.ts, fonts.ts, utils.ts
Profile pages use container queries rather than viewport breakpoints, so the editor's 375px phone frame renders exactly like a real phone.
Images are uploaded already resized WebP, so profiles use plain <img> with
lazy loading instead of next/image. That avoids per-storage-host image
configuration and the Vercel image-optimization quota.