All notable changes to SkilleTreeOSS are documented here.
Format follows Keep a Changelog. Versioning follows Semantic Versioning.
0.8.0 — 2026-03-02
A full in-app GUI for creating and editing skill trees — no JSON or GitHub knowledge required.
- Routes —
/builder(new blank tree) and/builder/[treeId](edit existing tree) lib/builder-store.ts— dedicated Zustand store (separate from the viewerlib/store.ts) managing: nodes, edges, tree metadata, layout direction ('LR' | 'TB'), draft auto-save, undo/redo history, selected node, preview mode, custom zones, recent icons, and UI state (showShortcuts)lib/builder-utils.ts—treeToDraft(tree: SkillTree): BuilderDraftconverter and theBuilderDrafttype ({ nodes, edges, meta })lib/autoLayout.ts— updatedcomputeAutoLayoutsignature to accept optionaldims?: { w: number; h: number }so the builder can supply exact node dimensions (224×180) rather than per-view defaultscomponents/builder/BuilderCanvas.tsx— root builder canvas;ReactFlowProviderwrapper, keyboard shortcut handler, context menu orchestration, smart node placement (findFreePosition), and auto-center-on-select viasetViewportcomponents/builder/BuilderNode.tsx— builder node card (w-52); handle positions driven bylayoutDir(Position.Top/Bottomfor TB,Position.Left/Rightfor LR)components/builder/BuilderNodeEditor.tsx—position: fixed; right: 0; lg:w-2/5right panel for editing all node properties; marked withdata-builder-panelso the canvas can measure its width for viewport centeringcomponents/builder/BuilderHeader.tsx— floating top overlay; Build/Preview tab switcher with Framer MotionlayoutId="tabBubble"liquid animation;?shortcut-guide buttoncomponents/builder/LeftToolbar.tsx— left sidebar: Select / Pan tool buttons with Framer MotionlayoutId="toolBubble"liquid bubble animation; Add Node, Zoom In/Out, Fit View, Layout Direction Toggle (LR ↔ TB), Undo, Redo, and?Helpcomponents/builder/ContextMenu.tsx— viewport-clamped right-click context menu with Framer Motion entrance; two variants: node menu (Edit, Duplicate, Delete) and pane menu (Add Here, Select All, Fit View, Auto-Layout, Shortcuts & Guide)components/builder/ShortcutsModal.tsx— spring-animated two-column modal: 6-step Quick Start guide (with coloured icons) + full keyboard reference (Tools / Selection / Canvas / History)components/builder/MetadataPanel.tsx— collapsible floating top-left panel for tree-level metadata (title, category, icon, difficulty, description, version, estimatedMonths)components/builder/ResourceEditor.tsx— inline resource list manager (add, edit, remove, drag-reorder)components/builder/IconPicker.tsx— searchable picker with Material Symbols Outlined categories + emoji sets; category tab bar with icon previewcomponents/builder/ZoneSelector.tsx— preset zone chips (Foundation, Frontend, Backend, Full-Stack, DevOps, Data, Security, …) with colour coding + custom zone input
- Multi-select — rectangular drag in Select mode (
selectionOnDrag,SelectionMode.Partial);Ctrl+clickadds to selection; custom cyan dashed selection-box via scoped CSS on.builder-rf-wrapper - Keyboard shortcuts —
VSelect tool,HPan tool,Nadd node at cursor (usesmousePosReftracking live cursor position),Ctrl+Aselect all,Ctrl+Ltoggle layout direction,Delete/Backspacedelete selected,?open shortcuts modal,Escapedeselect / close panels; all shortcuts are suppressed while an<input>or<textarea>has focus - Smart node placement (
findFreePosition) — 21-point outward spiral grid search (slot size240×212) prevents stacking; toolbar Add button maps the centre of theflex-1canvas wrapper (which already excludes the editor panel) to flow coordinates;Nshortcut uses the livemousePosRefcursor position - Auto-center on node select — mirrors
SkillCanvas.centerOnSelectedNode; usessetViewportwith the precise formulaoffset = screenCenter − flowCenter × zoomwherescreenCenter = (vw − panelW) / 2;panelWis read from[data-builder-panel].offsetWidth(CSS width, unaffected by thetranslateXslide animation); 80 ms delay lets the panel animation begin before the viewport pans - Liquid bubble animation — Framer Motion shared-layout
layoutIdpattern: an absolutely-positioned<motion.div layoutId="toolBubble">inside the active toolbar button animates between Select and Pan with spring physics (stiffness: 480, damping: 32, mass: 0.9); Build/Preview tabs uselayoutId="tabBubble"with similar springs - Direction toggle —
Ctrl+Lor toolbar button; recomputes Dagre with the newrankdirand callsfitViewafter a 60 ms delay; node handles update immediately vialayoutDirfrom the store - Preview mode — assembles a live
SkillTreeobject from builder state and renders<SkillCanvas>with all four viewer themes, sidebar, and prereq timeline;?modal still accessible in preview mode;Escapedeselects
BuilderCanvas.tsx/LeftToolbar.tsx— inlineSkillTreestubs for Dagre auto-layout were missing requireddescription: ''andestimatedMonths: 0fields (TS2739)BuilderNodeEditor.tsx— TypeScript re-widened capturednodevariable insidehandleIconChangeclosure despite a preceding null-guard; fixed withnode!.idnon-null assertionIconPicker.tsx—c.iconaccessed on the sharedcategoriesarray which is typed asICON_CATEGORIES | EMOJI_SETS;EMOJI_SETSentries lack theiconproperty; fixed with'icon' in cnarrowing guard (TS2551)BuilderCanvas.tsx— auto-center effect had a typonode.position.x + 504(should derive fromnode.measured); corrected to usenode.measured.width ?? 208andnode.measured.height ?? 180
0.7.0 — 2026-02-27
First public OSS release — full MVP platform, ready for community contributions.
- Interactive Skill Canvas — ReactFlow + Dagre auto-layout (LR/TB), 4 visual themes (World Map, RPG, Terminal, Neural), animated node state transitions (locked → available → completed)
- Auth & Progress Sync — Supabase email/password + OAuth, progress persisted in DB with localStorage fallback, reset-progress modal
- XP & Level System — 50 XP per completed node, 8 levels (Apprentice → Legend), SVG level-ring + Lv badge in UserMenu
- Explore Page — full-text search, category/difficulty filters, sort (A→Z, Most Popular, Top Rated, Easiest, Shortest), "Continue your journey" in-progress strip, pagination (12/page)
- Tree Ratings — 1–5 star rating modal, per-tree average rating shown on Explore
- Per-resource Voting — upvote / downvote each resource card (helpful / not helpful)
- Suggest a Better Resource — inline collapsible form →
resource_suggestionstable withpending → reviewed → accepted/rejectedworkflow - Live Platform Stats —
site_statssingleton + Postgres trigger; O(1) landing-page reads - Dynamic Featured Trees — configurable via
lib/featured-trees.ts - Canvas Toast System — sequential dismissal, card stacking
- Node Sidebar — resources, prerequisite timeline, collapsible distant-ancestor accordion, hover-to-highlight prereq on canvas
- 29 Skill Trees across Technology, Science, Art, Health, Finance, and Language
user_progress—completed_node_ids text[]per user per tree (implicit enrollment)tree_ratings— 1–5 star ratings, unique per (user, tree)site_stats— singleton counter maintained by Postgres triggerresource_suggestions— community resource feedback queue
- Next.js 16 (App Router, Turbopack), TypeScript, Tailwind CSS v4
- ReactFlow (
@xyflow/react) + Dagre, Framer Motion, Zustand - Supabase (Postgres, RLS, SSR client)
Tracked in GitHub Issues.
- Admin dashboard for reviewing
resource_suggestions - GitHub Actions JSON schema linting on PRs (
data/schema.json+ Zod) - Shareable progress image export