No description
- TypeScript 97.3%
- Kotlin 1.4%
- JavaScript 1.1%
- Shell 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Every app now has stories on the phone, the phone on its side and the tablet: Home Assistant's tiles and sheets, Clock, Timers, Calendar, Photos, the tile home with its editor, and the rail and bar shells. Each app's fake lives next to it (fake-home-assistant.ts, fake-calendar.ts, fake-timers.ts, fake-immich.ts, fake-shell.tsx), in memory, never a network. - App stories take their fakes as parameters.services; the preview makes them once around the whole device frame, so sheets drawn through Portal see them too. A story can also be framed as a tile (parameters.tile: cells, and live for a live tile). - The screenshot run asks Chrome for reduced motion and gives each shot its own profile, so no screen catches an arrival or a glide halfway. Segmented now honours reduced motion too. - The 1×1 soundbar tile's volume steps span the tile instead of spilling past it on a phone, and the Calendar's "No calendars" title is centred. |
||
| .woodpecker | ||
| apps | ||
| packages | ||
| panel | ||
| scripts | ||
| storybook | ||
| .gitignore | ||
| .prettierignore | ||
| .prettierrc | ||
| ARCHITECTURE.md | ||
| CLAUDE.md | ||
| eslint.config.mjs | ||
| GLOSSARY.md | ||
| mise.toml | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| PRODUCT.md | ||
| README.md | ||
| renovate.json | ||
| Taskfile.yml | ||
| tsconfig.json | ||
| vitest.config.ts | ||
Panalist
A React Native panel ecosystem: wall and desk panels made by composing installables (apps, home tiles, live tiles, settings views) over shared services. One app runs on every panel in the house; what differs per room comes from its settings.
packages/
config/ shared tsconfig + vitest preset
kernel/ shared definitions: Services, Storage, LiveTiles, Launcher, defineInstallable
ui/ shared RN components, shells, layouts, Tailwind tokens, the Storybook's book
runtime/ PanelRuntime: loads installables, keeps apps running, draws the chosen shell around the home and apps
android-host/ Android screensaver, lock-screen mode and home-app role
apps/
<name>/ installables: the tile home, the rail and bar shells, clock, timers, calendar, Home Assistant, Music Assistant, Immich, Mealie
panel/ the app (Expo): lists the installables and the first home tiles
storybook/ the Storybook: ui's book and components, and every app's stories on phone and tablet
Getting started
mise install # node 24 + task
task install # pnpm install (via corepack)
task storybook # UI components in the browser, http://localhost:6006
task panel:web # run the panel in the browser
task panel # Expo dev server (devices/simulators)
task panel:android # build the development variant and run it on the emulator
task ci:quality is the quality gate (type-check, ESLint, tests); task ci:compliance checks licenses.
Releases
Local builds are the development variant (cloud.olsen.panalist.dev). Releases (cloud.olsen.panalist) come from CI: every push to main updates a draft release on Forgejo from the conventional commits since the last tag. Publishing the draft creates the tag, and the tag pipeline (.woodpecker/release.yaml) builds the signed APK and attaches it, with a SHA-256 checksum, to the release.
Adding things
- An installable: copy
apps/clock, rename it to@panalist/app-<name>, and export adefineInstallable(...). Add it topanel/package.jsonand its sources inpanel/src/panel.ts. - Add every new workspace to the root
tsconfig.jsonreferences (and to those of each workspace that imports it).