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
Internal demo / training Kanban board for a fictitious bank's IT PMO. In-memory only.
Translation pending
BusinessHTMLGitHub @alfredangOnlineOwner 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
Single-file IT PMO Kanban board demo for a fictitious bank: vanilla HTML/CSS/JS, in-memory state, drag-and-drop, accessible keyboard moves, FormSubmit email notifications
Taken from the repository README
Loading the full README.
Read the full README ↗A single-file Kanban board for the IT Project Management Office of a fictitious bank, built as an internal demo/training app. It is plain HTML, CSS and JavaScript in one index.html, with no build step and no dependencies.
Live demo: https://alfredang.github.io/kanban8/
UOB-ITPM-0009.prefers-reduced-motion.[email protected]), so no notification goes anywhere until you configure it (see below).Either open index.html directly in a browser, or serve the folder:
python -m http.server 8000
# then open http://localhost:8000/
Serving over HTTP is the better option if you want to test the FormSubmit email call.
All configuration is in the CONFIG block at the top of the <script> in index.html:
| Constant | Purpose |
|---|---|
FORMSUBMIT_ENDPOINT | https://formsubmit.co/ajax/<your-address>. Replace [email protected]. |
ID_PREFIX | Prefix for task IDs (UOB-ITPM-) |
EMAIL_SUBJECT_TAG | Subject-line tag on notification emails |
FormSubmit setup:
FORMSUBMIT_ENDPOINT. That constant is the only place the code reads it from. The HTML comment above the script and CLAUDE.md also mention the placeholder, but they are documentation only.success: "false", and the app treats that answer as a failure.The task is always added to the board first. If the email fails, you only see a warning toast and the card stays on the board.
Reference data lives in constants near the top of the script: STATUSES, PROJECTS, CATEGORIES and PRIORITIES. These constants fill the dropdowns and act as allow-lists for validation. The CSS has rules keyed on status and priority values (.column[data-status="…"] and .card.prio-<slug>), so if you rename a value, update the matching CSS as well.
.github/workflows/pages.yml runs on GitHub Actions:
check runs on every push, pull request and manual dispatch. It scans the full git history for secrets with gitleaks, fails if index.html is missing, and fails if FORMSUBMIT_ENDPOINT no longer uses the placeholder address (so a real address can't reach the public site by accident).deploy runs after check passes on a push to main or a manual workflow_dispatch. It copies only the public site files (index.html and docs/) into _site/ and publishes that to GitHub Pages. CLAUDE.md, .github/ and other repo files are not deployed.index.html The whole app: HTML, CSS and JS
docs/screenshot.png Screenshot used in this README
.github/workflows/pages.yml CI checks and GitHub Pages deploy
CLAUDE.md Architecture notes for AI coding assistants
README.md This file
index.html. Don't add a build step, package manager or framework.state, then call renderBoard()" pattern. There is no incremental DOM patching.escapeHtml(). Toasts use textContent.data-action. To add one, add a button in renderCard() and a matching case in handleBoardClick.state.ui.focus so keyboard users keep their place.:root (palette, --space-1..6, radii, shadows) instead of hard-coded values. Put new code in the numbered banner-comment section it belongs to.See CLAUDE.md for a fuller architecture walkthrough.
There is no automated test suite. To test, open the page and work through the flows by hand: add a task (including the validation errors), filter, drag and drop, use the Move menu with the keyboard, delete, and check the layout at the 1100px and 767px breakpoints.