A framework-agnostic productivity domain engine extracted from a production PWA and Expo migration. It models tasks, notes, quick capture, productivity snapshots, and bilateral mind maps without coupling business rules to React, React Native, storage, authentication, or HTTP.
Explore the interactive showcase →
Lipp Board runs across web and mobile. Reimplementing behavior in every client would create drift, so the reusable rules live in a functional core while each product owns its imperative adapters.
React PWA ─┐
Expo app ──┼── use cases ── normalized state ── persistence adapter
Node tools ┘
This is not a source dump from the private product. It has clean public history, an explicit release allowlist, full-history secret scanning, and no production identifiers or private adapters.
| Module | What it proves |
|---|---|
| Tasks | Immutable lifecycle, legacy-status normalization, date semantics, priority sorting, derived views |
| Notes | Validated create/update/delete and locale-aware search |
| Productivity | Focus selection, completion metrics, progress snapshots |
| Quick capture | One boundary for tasks, thoughts, and validated mood entries |
| Mind maps | Bilateral tree mutations, subtree deletion, safe attachments, deterministic layout |
| Domain state | Hydration normalization and removal of malformed/orphaned data |
npm install github:lippdev/lippboard-coreimport { createDefaultState } from '@lippdev/lippboard-core/domain';
import { createTask, getTaskListView } from '@lippdev/lippboard-core/tasks';
const now = new Date('2026-08-13T09:00:00');
const initial = createDefaultState();
const next = createTask(initial, {
title: 'Ship the mobile client',
priority: 'Alta',
}, now);
console.log(initial.tasks.length); // 0 — previous state is untouched
console.log(getTaskListView(next, 'today', now).tasks.length); // 1- Zero runtime dependencies: portable, auditable, and cheap to consume.
- Functional core / imperative shell: domain code returns state; clients own I/O.
- Explicit clocks: date-sensitive paths accept
nowfor deterministic tests. - Boundary normalization: legacy and malformed persisted data are repaired once.
- Security by extraction: public content is allowlisted rather than mirrored from private Git history.
Read architecture and trade-offs or the public API reference.
npm test # behavioral + showcase checks
npm run audit:public # allowlist + private-pattern gateCI also runs Gitleaks over the complete public history and deploys the dependency-free showcase to GitHub Pages. Tests cover immutability, validation failures, legacy hydration, unsafe URL rejection, tree layout, subtree deletion, and cross-module flows.
src/domain/ normalized state and entities
src/use-cases/ application behavior
src/services/ shared status vocabulary
showcase/ browser demo importing the real core
scripts/ public-boundary audit
test/ executable behavior specifications
docs/ architecture and API reference
Generic behavior lands here first and passes the public gate. Product-specific authentication, APIs, infrastructure, AI prompts, deployment configuration, branding, and user data stay in the private product repository. The product consumes stable public revisions instead of maintaining a long-lived public branch.
Built by Filipe Moreira, full-stack software engineer — GitHub.
MIT © Filipe Moreira