Askr is a contract-driven platform built from distinct packages that are designed to work together. The packages live in separate repositories so each package can own its code, docs, tests, and release metadata while preserving one platform design.
The platform is split by responsibility, not by implementation convenience:
@askrjs/askrprovides the runtime foundation: rendering, routing, lifecycle, SSR, SSG, and shared primitives.@askrjs/uiprovides headless interaction semantics and accessibility behavior.@askrjs/themesprovides optional presentation through CSS tokens and component styling.@askrjs/lucideprovides generated icon wrappers for common app surfaces.@askrjs/cliprovides project scaffolding and workflow tools.@askrjs/viteprovides Vite integration for the runtime and starter workflows.
The core package publishes low-level interaction and icon contracts for sibling
package implementations. @askrjs/ui owns the composed headless component
behavior; @askrjs/lucide and @askrjs/logos own icon wrappers. The
@askrjs/askr/foundations/interactions and /icon subpaths are platform
internal contracts for those maintainers, not application component APIs.
The intended dependency flow is simple:
- Applications depend on
@askrjs/askras the runtime contract. - UI packages build on runtime foundations, not on each other's internals.
- Themes provide presentation for the UI layer without adding runtime behavior.
- Icon wrappers stay thin and deterministic so they can be swapped or regenerated easily.
- CLI and Vite improve the developer experience without becoming runtime dependencies. That model keeps the package boundaries visible while still making the platform feel cohesive.
- Public packages should expose stable, documented subpaths and avoid hidden cross-package imports.
- Generated output must be deterministic and reviewable.
- Build and type-check behavior should be predictable from package metadata, not from ad hoc scripts.
- Package roles should be obvious from the package name and docs.
- Consolidation is only worth doing when two packages no longer have distinct contracts.
- A single catch-all package that hides the difference between runtime, styling, tooling, and guardrails.
- Manual duplication of package metadata across scripts, export maps, and docs.
- Package-manager-specific behavior that changes the contract depending on the machine.
- Internal implementation details leaking across package boundaries.