@geenius/changelog
v0.17.0
Published
Geenius Changelog — In-app changelog system for Convex apps (React, SolidJS, and React Native)
Downloads
87
Maintainers
Readme
@geenius/changelog
In-app release notes, changelog feeds, widget surfaces, and launch-provider helpers for Geenius products.
Install
pnpm add @geenius/changelogFor React, SolidJS, or React Native UI entrypoints, install the runtime peers used by the shared Geenius UI layer for the variant you consume:
pnpm add @geenius/ui @tanstack/match-sorter-utils lucide-react react react-dom solid-jsImports
import { configureChangelog, groupByMonth } from "@geenius/changelog";
import { ChangelogPublicPage, ChangelogWidgetPage } from "@geenius/changelog/react";
import "@geenius/changelog/react/styles.css";
import { ChangelogPublicPage as ChangelogPublicPageCss } from "@geenius/changelog/react-css";
import "@geenius/changelog/react-css/styles.css";
import { ChangelogPublicPage as ChangelogPublicPageSolid } from "@geenius/changelog/solidjs";
import "@geenius/changelog/solidjs/styles.css";
import { ChangelogPublicPage as ChangelogPublicPageSolidCss } from "@geenius/changelog/solidjs-css";
import "@geenius/changelog/solidjs-css/styles.css";
import { ChangelogPublicPage as ChangelogPublicPageNative } from "@geenius/changelog/react-native";
import { schema, listEntries, publishEntry } from "@geenius/changelog/convex";Package Surface
| Subpath | Purpose |
| --- | --- |
| @geenius/changelog | Shared changelog types, config helpers, sanitizers, RSS helpers, and grouping utilities |
| @geenius/changelog/react | Tailwind-based React pages, components, hooks, and provider wiring |
| @geenius/changelog/react/styles.css | Explicit React Tailwind token bridge stylesheet |
| @geenius/changelog/react-css | Vanilla CSS React pages, components, hooks, and provider wiring |
| @geenius/changelog/react-native | React Native pages, components, hooks, provider wiring, and native Storybook smoke coverage |
| @geenius/changelog/solidjs | Tailwind-based SolidJS pages, components, primitives, and provider wiring |
| @geenius/changelog/solidjs/styles.css | Explicit SolidJS Tailwind token bridge stylesheet |
| @geenius/changelog/solidjs-css | Vanilla CSS SolidJS pages, components, primitives, and provider wiring |
| @geenius/changelog/convex | Convex schema, queries, and mutations for changelog persistence |
| @geenius/changelog/neon | Neon/Postgres changelog store and migrations |
| @geenius/changelog/cloudflareKV | Cloudflare Workers KV changelog snapshots and lightweight state |
| @geenius/changelog/memory | In-memory changelog store for tests and local demos |
Use cloudflareKV for provider ids and public imports. The private workspace package name can remain lowercase npm-safe (@geenius/changelog-cloudflare-kv) because it is not the public launch-axis token.
Deferred variant subpaths may exist on disk for the broader ecosystem axis, but
this run filters them out with inScope: false: react-shadcn, react-mui,
react-ant, react-chakra, react-mantine, react-heroui,
react-daisyui, solidjs-ark, solidjs-kobalte, and solidjs-solidui.
Variants
| Axis | In scope for this package run |
| --- | --- |
| UI variants | react, react-css, solidjs, solidjs-css, react-native |
| DB providers | convex, neon, cloudflareKV, memory |
Framework-agnostic helpers, types, constants, and errors only export from the
package root. Framework subpaths export framework-specific UI code; there is no
public ./shared subpath.
Usage
Shared configuration
import { configureChangelog } from "@geenius/changelog";
configureChangelog({
siteName: "Geenius",
changelogUrl: "https://geenius.dev/changelog",
});React page
import { ChangelogPublicPage } from "@geenius/changelog/react";
import "@geenius/changelog/react/styles.css";
export function UpdatesRoute() {
return (
<ChangelogPublicPage
entries={entries}
siteUrl="https://geenius.dev"
/>
);
}React CSS page
import { ChangelogPublicPage } from "@geenius/changelog/react-css";
import "@geenius/changelog/react-css/styles.css";
export function UpdatesRoute() {
return (
<ChangelogPublicPage
entries={entries}
siteUrl="https://geenius.dev"
viewerId="user_123"
initialUserReactions={["entry_launch:party"]}
onReact={(entryId, emoji) => saveReaction(entryId, emoji)}
/>
);
}SolidJS page
import { ChangelogPublicPage } from "@geenius/changelog/solidjs";
import "@geenius/changelog/solidjs/styles.css";
export function UpdatesRoute() {
return <ChangelogPublicPage entries={entries()} siteUrl="https://geenius.dev" />;
}SolidJS CSS page
import { ChangelogPublicPage } from "@geenius/changelog/solidjs-css";
import "@geenius/changelog/solidjs-css/styles.css";
export function UpdatesRoute() {
return <ChangelogPublicPage entries={entries()} siteUrl="https://geenius.dev" />;
}React Native page
import { ChangelogPublicPage } from "@geenius/changelog/react-native";
export function UpdatesScreen() {
return <ChangelogPublicPage entries={entries} siteUrl="https://geenius.dev" />;
}Convex
import { listEntries, publishEntry, schema } from "@geenius/changelog/convex";
export { schema };
export const queries = { listEntries };
export const mutations = { publishEntry };Neon
import { createNeonChangelogStore, neonChangelogMigrations } from "@geenius/changelog/neon";
const store = createNeonChangelogStore({ sql });
await Promise.all(neonChangelogMigrations.map((migration) => sql(migration.sql)));Cloudflare KV
import { createCloudflareKVChangelogStore } from "@geenius/changelog/cloudflareKV";
const store = createCloudflareKVChangelogStore({
kv: env.CHANGELOG_KV,
prefix: "geenius:changelog",
});Memory
import { createMemoryChangelogStore } from "@geenius/changelog/memory";
const store = createMemoryChangelogStore({ entries });API Summary
Root exports include configuration helpers, typed errors, content sanitizers, RSS generation, grouping utilities, i18n formatting helpers, SEO metadata builders, repository contracts, and canonical category/reaction constants.
React variants export ChangelogProvider, useChangelogConfig,
useOptionalChangelogConfig, useChangelog, useChangelogAdmin,
useChangelogWidget, useReactions, the public/admin/widget pages, and the
badge, card, timeline, search, widget, action, and reaction components. SolidJS
variants export the same page and component surface with useChangelogConfig,
useOptionalChangelogConfig, createChangelog, createChangelogAdmin,
createChangelogWidget, and createReactions primitives.
Storybook
The package includes one V2 stock Storybook app per UI variant under
apps/storybook-<variant>/. In this run, the active apps are react,
react-css, solidjs, solidjs-css, and react-native. Run a specific app
from the package root:
pnpm storybook:react
pnpm storybook:react-css
pnpm storybook:solidjs
pnpm storybook:solidjs-css
pnpm storybook:react-native:buildBuild or test the full app set with:
pnpm test:storybook:build
pnpm test:storybookContributing Tests
variants.json is the single source of truth for UI variants, DB providers,
Storybook app names, browser coverage, coverage thresholds, and bundle budgets.
When adding a variant, update variants.json first, then add the package source
under packages/<variant>/; the gauntlet scripts read the manifest.
Use these package-root checks before opening a PR:
pnpm test:gauntlet
pnpm test:all
pnpm test:visual --update-snapshotstest:gauntlet runs lint, app lint, publint, type-check, unit and contract
tests, coverage aggregation, 90% changed-lines coverage, ATTW, bundle budgets,
supply-chain audit, license checks, and SBOM emission. test:all adds
Storybook build/play checks, provider conformance, Playwright e2e, a11y, visual,
and perf. Use
PW_VISUAL=0 pnpm test:visual only for local fast iteration; PR visual
regression is default-on.
Deep architecture and product requirements live in
/Users/mehdinabhani/Projects/antigravity/boilerplates/.docs/DOCS/PACKAGES/CHANGELOG.md
and the package PRD/plan under /Users/mehdinabhani/Projects/antigravity/boilerplates/.docs/.
License
SEE LICENSE IN LICENSE
