Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
One connected map of hobbies. Mark what you practise and watch the paths light up between them
LifestyleHTML · JavaScriptGitHub @energon-a-secasOnlineOwner 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
A constellation atlas of hobbies: highlight yours, trace the paths between them, and compare maps with friends
Loading the full README.
Read the full README ↗A constellation atlas of hobbies: highlight yours, trace the paths between them, and compare maps with friends
Aficion lays every hobby on one connected map, with the crafts that sit underneath them drawn on the same canvas rather than hidden in a legend. Mark what you practise and your nodes turn gold, the links between the adjacent ones light up, and two things you thought were unrelated turn out to be two steps apart through a craft you already have. It is for the person with four shelves in one room who has never seen the four as one object, and for the friend they send the link to.
Nothing is scored and nothing is ranked. A suggestion arrives with the sentence that justifies it, built from a shared craft, a shared tag or shared gear, and the map rings the node that sentence names.
Live: aficion.neorgon.com
#node= links remain supported.| Key | Does |
|---|---|
| Drag, wheel or pinch | Pan and zoom the canvas |
| Arrows | Follow a connection in that direction |
| Backspace | Return along your exploration trail |
| Shift + arrows | Pan the camera |
| Enter | Mark or unmark the focused node |
I | Drill into an inner tree |
| Double-click a dot | Open its subtopics |
F | Fit the whole atlas |
M | Fit your own marks |
/ | Focus the search box |
| Escape | Clear a trace, or close the drill-in |
ES modules require an HTTP server (not file://):
make serve
Then open http://localhost:8877.
The taxonomy under data/ is validated by a dependency-free Node script. It
exits 0, or it names the file, the record and the field that is wrong:
make search-index # regenerate after corpus edits
make validate # both languages, browse structure, connected trails, search-index freshness
make test # search, graph navigation, route persistence and concurrent-loading regressions
make pages # refresh crawler pages after corpus edits
Optional browser acceptance checks use Playwright from your development environment (the app has no runtime dependency):
node tools/check-explorer.cjs
node tools/check-explorer.cjs --webkit
node tools/check-atlas.cjs
node tools/check-atlas.cjs --webkit
node tools/check-atlas-branches.cjs
node tools/check-atlas-branches.cjs --webkit
node tools/check-trails.cjs
node tools/check-trails.cjs --webkit
With the preview server running, these check saved collections, subtopic search, browser history, sharing, map navigation, mobile layout, language switching and loading failures. Screenshots are written under /private/tmp/aficion-*.png. Set AFICION_PREVIEW_URL to test a different local port.
Zero build: no bundler, no npm dependency for the app, no backend. The corpus is
static JSON fetched at boot; the profile lives in localStorage and in the URL
fragment.
aficion-site/
├── index.html # HTML shell: header, canvas stage, side panel, dialogs
├── css/
│ └── style.css # All site styles. Identity is --accent only; the rest is CDN base.css
├── js/
│ ├── app.js # Entry point, under 50 lines
│ ├── navigation.js # Explore, category, hobby, collection and atlas routes
│ ├── explorer.js # Browse lists, search, breadcrumbs and collection
│ ├── explore-detail.js # Hobby pages, subtopics, starting exercises and lenses
│ ├── explore-model.js # Search and explained connection queries
│ ├── explore-events.js # Browser navigation and transitions into the atlas
│ ├── state.js # Shared mutable state, localStorage
│ ├── render.js # Builds the ViewModel for the canvas, renders the panel
│ ├── events.js # All wiring. No inline onclick anywhere
│ ├── actions.js # Marking, tracing, flying, drill-in
│ ├── panels.js # Detail, mine, suggestion, compare and build panels
│ ├── modal.js # Native <dialog> helper with focus restore
│ ├── utils.js # escHtml, live region, small helpers
│ ├── alloc.js # Allocated set, gold route, components, bridges, buckets
│ ├── discover.js # Suggestions and the sentence that justifies each one
│ ├── profile.js # URL codec: gzip + urlsafe base64, versioned, migration chain
│ ├── compare.js # Two profiles in, four sets and a per-bucket tally out
│ ├── inner.js # Inner-tree overlay
│ ├── builds.js # Curated builds
│ └── atlas/
│ ├── load.js # Fetches and indexes the corpus, memoised inner trees
│ ├── layout.js # Five deterministic layout recipes from cluster anchors
│ ├── camera.js # Pan, zoom-at-cursor, clamps, flyTo
│ ├── pick.js # Hit-testing with a 12px screen-space floor
│ ├── theme.js # Reads canvas colours from CSS custom properties
│ ├── draw.js # Frame orchestration. ctx.filter is never set: not Baseline
│ ├── draw-edges.js # Edge passes, widest and faintest first
│ ├── draw-nodes.js # Node passes: face, halo, rings per channel
│ └── draw-labels.js # Label placement with collision rejection
├── data/ # The corpus. Content is data, never inside a .js file
│ ├── atlas.json # Clusters, tags, retired ids
│ ├── edges.json # 662 top-layer edges, typed
│ ├── explore.json # Browse directions, example diagram and 30 first experiments
│ ├── search-index.json # Generated index, including every inner subtopic
│ ├── builds.json # 9 curated builds
│ ├── trails.json # 6 guided discovery routes, all following authored edges
│ ├── clusters/*.json # 22 cluster files, 321 hobby nodes
│ └── inner/*.json # 24 inner trees, 178 nodes
├── tools/
│ └── validate-corpus.mjs # 33 structural checks over data/. Plain node, no install
├── docs/
│ └── architecture.mmd # Source for architecture.svg
├── 404.html
├── CNAME
├── Makefile
└── README.md