Grove gives TypeScript teams a dependable foundation for building web and cloud applications. It packages recurring engineering decisions—from code quality rules to interface and data integrations—so projects can start consistently, stay type-safe, and focus on their own functionality.
The example demonstrates how the Grove design system helps teams build custom digital health and research interfaces from reusable, accessible, and themeable React components. Explore the live Storybook to experience the light and dark themes, components, and their variants.
| Package | Use it for |
|---|---|
@schmiedmayerlab/grove-configurations |
Shared ESLint and Prettier configuration for Node and React |
@schmiedmayerlab/grove-design-system |
React components, layouts, forms, themes, and utilities |
@schmiedmayerlab/grove-firebase-cloud-messaging |
Cloud Messaging, device registration, and notification flows |
@schmiedmayerlab/grove-fhir |
FHIR R4B schemas and validation |
@schmiedmayerlab/grove-firebase-utils |
Shared Firebase converters and application utilities |
Each package README contains focused setup and usage guidance.
The design system documentation provides a guided introduction, while Storybook lets you explore the components interactively.
Packages are independently installable from the @schmiedmayerlab npm scope and use one coordinated release version.
Grove packages require Node.js 24 or later. Install the package you need directly:
npm install @schmiedmayerlab/grove-design-systemDevelopment-only tooling belongs in devDependencies:
npm install --save-dev @schmiedmayerlab/grove-configurationsDesign system applications can follow the browser or operating-system appearance with one provider option:
<GroveProvider router={routerProps} colorScheme="system">
{children}
</GroveProvider>Continue with the selected package's README for required peer dependencies and configuration. Grove is currently pre-1.0, so review the release notes when upgrading.
To work on Grove itself, install:
- Node.js 24
- npm 12
Clone the repository and install the package and documentation dependencies:
git clone https://github.com/SchmiedmayerLab/grove-ts.git
cd grove-ts
npm ci
npm ci --prefix packages/design-system/docsRun the complete local quality gate before requesting review:
npm run validateFor faster iteration, target a single workspace with npm's --workspace option:
npm run build --workspace @schmiedmayerlab/grove-design-system
npm test --workspace @schmiedmayerlab/grove-firebase-utilsUseful repository-wide commands include:
| Command | Purpose |
|---|---|
npm run build |
Build every workspace |
npm test |
Run repository and workspace tests |
npm run test:coverage |
Run workspace tests with coverage |
npm run lint:ci |
Run linting with no warnings allowed |
npm run analyze |
Check dead files, dependencies, exports, and import cycles |
npm run docs |
Start the design system documentation locally |
npm run pages:build |
Assemble the complete GitHub Pages artifact |
npm run validate |
Run the complete validation suite used before review |
Grove uses fixed, bare semantic versions such as 0.1.0 across all packages; prerelease versions such as 0.2.0-beta.1 use the npm next tag.
Publishing a GitHub release runs the validation pipeline, publishes missing versions through npm Trusted Publishing, verifies the registry state, and deploys the documentation and Storybook.
Maintainers can validate release preparation from any branch without publishing or deploying:
gh workflow run deployment.yml --ref <branch> \
-f packageVersion=0.2.0 \
-f dryRun=trueMaintainers can create a normal release in the GitHub interface or with:
gh release create 0.2.0 --target main --title 0.2.0 --generate-notesAn unpublished package needs one token-based publication before npm Trusted Publishing can be configured.
Create a short-lived granular npm token with read and write access to the @schmiedmayerlab scope and Bypass two-factor authentication enabled, then temporarily add it as the NPM_TOKEN repository secret.
Manually run Deployment from main.
Use * for the repository's first publication or comma-separated package names for selected new workspaces:
gh workflow run deployment.yml --ref main \
-f packageVersion=0.1.0 \
-f bootstrapPackages='*'For example, set bootstrapPackages to @schmiedmayerlab/grove-new-package when adding a single workspace later.
After the workflow creates the packages, sign in to npm from a trusted workstation and authorize deployment.yml as their publisher:
npm login
npm run configure:trusted-publishing -- --packages '@schmiedmayerlab/grove-new-package'npm requires an interactive maintainer session with two-factor authentication for this operation; it does not accept granular tokens, including bypass-2FA tokens, for changing Trusted Publishers.
Use --packages '*' when configuring every public workspace in a new repository.
Delete the token secret after an OIDC publication succeeds.
The workflow verifies and skips versions already present on npm, making recovery from an interrupted release safe.
If packages were published before Trusted Publishing was configured, run the helper from main and then rerun the failed release jobs:
npm login
npm run configure:trusted-publishing
gh run rerun <release-run-id> --failedContributions to this project are welcome. Please make sure to read the contribution guidelines and the contributor covenant code of conduct first. You can find a list of contributors in the CONTRIBUTORS.md file.
This project is licensed under the MIT License. See LICENSE.md for more information.
If you use this software, please cite it using the metadata in CITATION.cff, which GitHub surfaces through the Cite this repository button.
For more information, visit the Schmiedmayer Lab GitHub organization.

