Aether-Packages by AetherAssembly
Shared npm packages published to the GitHub Package Registry under the @aetherAssembly scope. Used by Before It's Gone.
Packages
| Package | Version | Description |
|---|---|---|
@aetherAssembly/core | 1.0.3 | Storage adapters and shared TypeScript types |
@aetherAssembly/ui | 1.0.3 | React 19 component library |
Installation
Both packages are published to the GitHub Package Registry. Add the following to your project's .npmrc:
@aetherAssembly:registry=https://npm.pkg.github.com
Then install as normal:
npm install @aetherAssembly/core
npm install @aetherAssembly/ui # React apps only
read:packages scope set as NODE_AUTH_TOKEN, even for public packages. Add it to ~/.npmrc:
//npm.pkg.github.com/:_authToken=YOUR_TOKEN
@aetherAssembly/core
Framework-agnostic utilities for local-first apps.
Storage adapters
All three adapters implement the same async StorageAdapter interface, so you can swap them without changing call sites:
import { IDBAdapter, LocalStorageAdapter, MemoryAdapter } from '@aetherAssembly/core'
import type { StorageAdapter } from '@aetherAssembly/core'
| Adapter | Backed by | Best for |
|---|---|---|
IDBAdapter | IndexedDB | Any significant data in a browser — no quota limits, off-main-thread |
LocalStorageAdapter | localStorage | Small flags and settings; gracefully no-ops in SSR/workers |
MemoryAdapter | Map | Unit tests — implements the full interface, no side effects |
const storage = new IDBAdapter('my-app', 'items')
await storage.set('theme', 'dark')
const theme = await storage.get<string>('theme') // 'dark'
await storage.keys() // ['theme']
await storage.delete('theme')
await storage.clear()
See the Storage page for the full adapter contract and usage details.
Shared types
import type { ID, Timestamp, Nullable, Optional, BaseEntity } from '@aetherAssembly/core'
interface WardrobeItem extends BaseEntity {
// id, createdAt, updatedAt inherited
name: string
category: string
}
@aetherAssembly/ui
React 19 components styled with --ae-* CSS custom properties. Import the stylesheet once and override tokens to match your app's palette.
import { Button, Card, Badge, Input, Modal } from '@aetherAssembly/ui'
import '@aetherAssembly/ui/src/styles.css'
| Component | Description |
|---|---|
Button | 4 variants · 3 sizes · loading state with spinner |
Card | header and footer ReactNode slots |
Badge | 5 variants: default · success · warning · danger · info |
Input | label · error with aria-invalid · hint text |
Modal | native <dialog> with showModal(); backdrop click to close |
See the UI Components page for the full token reference and per-component prop tables.
How Before It's Gone uses these packages
Before It's Gone installs both packages at the monorepo root. Its local workspace packages are named @aetherAssembly/big-core and @aetherAssembly/big-ui to avoid colliding with the upstream scope. @aetherAssembly/big-core re-exports LocalStorageAdapter from @aetherAssembly/core for settings storage, and @aetherAssembly/big-ui uses components from @aetherAssembly/ui (e.g. Badge in InventoryCard).
License
Both packages are published under AGPL-3.0-only. If you use them in your own project — including as a network service — your project must also be released under AGPL-3.0 and its source made available to users. Contact support@aetherassembly.org to discuss a commercial licence.