From portfolio
Use when working with Portfolio — a ClojureScript visual REPL for developing UI components in isolation. Activate when the user asks about defscene, portfolio.ui/start!, the :portfolio shadow-cljs build target, scene organization, UI customization (background/viewport/grid/CSS), framework adapters (Reagent, React, Replicant, Rum, Dumdom), stateful scenes with atoms, tap> REPL usage, or disabling Portfolio in production builds.
How this skill is triggered — by the user, by Claude, or both
Slash command
/portfolio:portfolioThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Portfolio is a ClojureScript "visual REPL" — it renders UI components in named, isolated **scenes** so you can see every component state at a glance. It is similar to Storybook.js but designed for REPL-driven ClojureScript development.
Portfolio is a ClojureScript "visual REPL" — it renders UI components in named, isolated scenes so you can see every component state at a glance. It is similar to Storybook.js but designed for REPL-driven ClojureScript development.
Current release: no.cjohansen/portfolio {:mvn/version "2026.03.1"}
| Task | Go to |
|---|---|
| Install, start the UI, shadow-cljs setup | setup.md |
Define scenes with defscene, params, atoms, lifecycle | defscene.md |
| Choose a framework adapter (Reagent, React, Replicant…) | defscene.md |
| Organize scenes into collections, folders, packages | organization.md |
| Customize background, viewport, grid, CSS, HTML | customize-ui.md |
Use tap> from the REPL without defining a scene | setup.md |
| Disable Portfolio in production builds | setup.md |
| Common mistakes and things to avoid | anti-patterns.md |
Portfolio renders scenes — named snapshots of a component in a specific state. Scenes live in regular ClojureScript namespaces (typically named *-scenes), and Portfolio automatically organizes them into a navigable sidebar by namespace hierarchy.
defscene → scene → namespace (package) → folder → sidebar
The UI runs in the browser at your dev server address. Re-evaluating a defscene at the REPL re-renders it immediately — no page refresh needed.
;; deps.edn
{:deps {no.cjohansen/portfolio {:mvn/version "2026.03.1"}}}
;; src/my/button_scenes.cljs
(ns my.button-scenes
(:require [portfolio.reagent :refer-macros [defscene]]))
(defscene default-button
[:button.btn "Click me"])
(defscene disabled-button
[:button.btn {:disabled true} "Can't click"])
;; src/my/dev/portfolio.cljs — call this from your shadow-cljs :runner-ns
(ns my.dev.portfolio
(:require [portfolio.ui :as ui]))
(ui/start! {:config {:css-paths ["/css/app.css"]}})
:portfolio Build TargetAuto-loads every namespace whose name ends in -scenes. The fastest setup path:
;; shadow-cljs.edn
{:deps {:aliases [:dev]}
:dev-http {8080 ["dev-resources/public" "classpath:public"]}
:builds
{:portfolio
{:target :portfolio
:runner-ns my.dev.portfolio ;; omit to start with no config
:dev {:output-dir "dev-resources/public/js"}}}}
"classpath:public" in :dev-http is required — it serves Portfolio's bundled assets from the jar.
dev/, scenes/, or a :dev alias source path) so they are never included in production builds.:params whenever the component data is non-trivial — it enables REPL tinkering and search indexing.:portfolio shadow-cljs target over manual namespace loading for new projects.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub stoating/clojure-portfolio-skill --plugin portfolio