open-index/open-npm huggingface dataset:
npm package: @sprocketui-react/button
Description: Sprocket's standalone React button component.
Author: Corinvo OSS Team
Latest version: 1.2.22

<div align="center">
  <a href="https://sprocketui.com">
    <img alt="Sprocket Logo" src="https://avatars.githubusercontent.com/u/206497492?s=100&v=4">
  <a>

  <h2>Sprocket UI React - Button</h2>

  <p>Sprocket's standalone button component for React based projects.</p>

  <a aria-label="Corinvo" href="https://corinvo.github.io">
    <img src="https://img.shields.io/badge/Made%20by-Corinvo-black.svg?style=for-the-badge&color=black">
  </a>
  <a href="https://www.npmjs.com/package/@sprocketui-react/button">
    <img alt="NPM version" src="https://img.shields.io/npm/v/@sprocketui-react/button.svg?style=for-the-badge">
  </a>
  <a aria-label="License" href="https://github.com/sprocketui/NodeKit/blob/main/LICENSE">
    <img src="https://img.shields.io/badge/License-MIT-97CA25.svg?style=for-the-badge">
  </a>
  <img src="https://img.shields.io/badge/-ReactJs-61DAFB?logo=react&logoColor=white&style=for-the-badge">
</div>
npm package: @sprocketui-react/input
Description: Sprocket's standalone React input component.
Author: Corinvo OSS Team
Latest version: 1.1.3

<div align="center">
  <a href="https://sprocketui.com">
    <img alt="Sprocket Logo" src="https://avatars.githubusercontent.com/u/206497492?s=100&v=4">
  <a>

  <h2>Sprocket UI React - Input</h2>

  <p>Sprocket's standalone input component for React based projects.</p>

  <a aria-label="Corinvo" href="https://corinvo.github.io">
    <img src="https://img.shields.io/badge/Made%20by-Corinvo-black.svg?style=for-the-badge&color=black">
  </a>
  <a href="https://www.npmjs.com/package/@sprocketui-react/input">
    <img alt="NPM version" src="https://img.shields.io/npm/v/@sprocketui-react/input.svg?style=for-the-badge">
  </a>
  <a aria-label="License" href="https://github.com/sprocketui/NodeKit/blob/main/LICENSE">
    <img src="https://img.shields.io/badge/License-MIT-97CA25.svg?style=for-the-badge">
  </a>
  <img src="https://img.shields.io/badge/-ReactJs-61DAFB?logo=react&logoColor=white&style=for-the-badge">
</div>
npm package: @sprocketui-react/label
Description: Sprocket's standalone React label component.
Author: Corinvo OSS Team
Latest version: 1.1.2

<div align="center">
  <a href="https://sprocketui.com">
    <img alt="Sprocket Logo" src="https://avatars.githubusercontent.com/u/206497492?s=100&v=4">
  <a>

  <h2>Sprocket UI React - Label</h2>

  <p>Sprocket's standalone label component for React based projects.</p>

  <a aria-label="Corinvo" href="https://corinvo.github.io">
    <img src="https://img.shields.io/badge/Made%20by-Corinvo-black.svg?style=for-the-badge&color=black">
  </a>
  <a href="https://www.npmjs.com/package/@sprocketui-react/label">
    <img alt="NPM version" src="https://img.shields.io/npm/v/@sprocketui-react/label.svg?style=for-the-badge">
  </a>
  <a aria-label="License" href="https://github.com/sprocketui/NodeKit/blob/main/LICENSE">
    <img src="https://img.shields.io/badge/License-MIT-97CA25.svg?style=for-the-badge">
  </a>
  <img src="https://img.shields.io/badge/-ReactJs-61DAFB?logo=react&logoColor=white&style=for-the-badge">
</div>
npm package: @sprocketui-react/tabs
Description: Sprocket's standalone React tabs component.
Author: Corinvo OSS Team
Latest version: 1.1.15

<div align="center">
  <a href="https://sprocketui.com">
    <img alt="Sprocket Logo" src="https://avatars.githubusercontent.com/u/206497492?s=100&v=4">
  <a>

  <h2>Sprocket UI React - Tabs</h2>

  <p>Sprocket's standalone tabs component for React based projects.</p>

  <a aria-label="Corinvo" href="https://corinvo.github.io">
    <img src="https://img.shields.io/badge/Made%20by-Corinvo-black.svg?style=for-the-badge&color=black">
  </a>
  <a href="https://www.npmjs.com/package/@sprocketui-react/tabs">
    <img alt="NPM version" src="https://img.shields.io/npm/v/@sprocketui-react/tabs.svg?style=for-the-badge">
  </a>
  <a aria-label="License" href="https://github.com/sprocketui/NodeKit/blob/main/LICENSE">
    <img src="https://img.shields.io/badge/License-MIT-97CA25.svg?style=for-the-badge">
  </a>
  <img src="https://img.shields.io/badge/-ReactJs-61DAFB?logo=react&logoColor=white&style=for-the-badge">
</div>
npm package: @sprocketui-types/button
Description: <div align="center">   <a href="https://necto.dev">     <img alt="Necto Logo" src="https://avatars.githubusercontent.com/u/206497492?s=100&v=4">   <a>
Author: Corinvo OSS Team
Latest version: 1.0.2
Deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

<div align="center">
  <a href="https://necto.dev">
    <img alt="Necto Logo" src="https://avatars.githubusercontent.com/u/206497492?s=100&v=4">
  <a>

  <h2>Sprocket UI Types - Button</h2>

  <p>Sprocket's framework agnostic shared type definition for components.</p>

  <a aria-label="Corinvo" href="https://corinvo.github.io">
    <img src="https://img.shields.io/badge/Made%20by-Corinvo-black.svg?style=for-the-badge&color=black">
  </a>
  <a href="https://www.npmjs.com/package/@sprocketui-types/button">
    <img alt="NPM version" src="https://img.shields.io/npm/v/@sprocketui-types/button.svg?style=for-the-badge">
  </a>
  <a aria-label="License" href="https://github.com/sprocketui/NodeKit/blob/main/LICENSE">
    <img src="https://img.shields.io/badge/License-MIT-97CA25.svg?style=for-the-badge">
  </a>
</div>
npm package: @sprocketui-types/buttons
Description: <div align="center">   <a href="https://necto.dev">     <img alt="Necto Logo" src="https://avatars.githubusercontent.com/u/206497492?s=100&v=4">   <a>
Author: Corinvo OSS Team
Latest version: 1.1.0

<div align="center">
  <a href="https://necto.dev">
    <img alt="Necto Logo" src="https://avatars.githubusercontent.com/u/206497492?s=100&v=4">
  <a>

  <h2>Sprocket UI Types - Button</h2>

  <p>Sprocket's framework agnostic shared type definition for components.</p>

  <a aria-label="Corinvo" href="https://corinvo.github.io">
    <img src="https://img.shields.io/badge/Made%20by-Corinvo-black.svg?style=for-the-badge&color=black">
  </a>
  <a href="https://www.npmjs.com/package/@sprocketui-types/button">
    <img alt="NPM version" src="https://img.shields.io/npm/v/@sprocketui-types/button.svg?style=for-the-badge">
  </a>
  <a aria-label="License" href="https://github.com/sprocketui/NodeKit/blob/main/LICENSE">
    <img src="https://img.shields.io/badge/License-MIT-97CA25.svg?style=for-the-badge">
  </a>
</div>
npm package: @sprocketui-types/tabs
Description: Framework-agnostic types for Sprocket UI Tabs component.
Author: Corinvo OSS Team
Latest version: 1.1.0

# @sprocketui-types/tabs

Framework-agnostic types for Sprocket UI Tabs component.

## Installation

```bash
pnpm add @sprocketui-types/tabs
```

## Usage

```ts
import type { TabsOrientation, TabsActivationMode } from '@sprocketui-types/tabs';

const orientation: TabsOrientation = 'horizontal';
const activation: TabsActivationMode = 'automatic';
```
npm package: @spronq.io/styled-components-baseline
Description: __⚡️ This package is in active development, and --not-- fit for production yet.__
Latest version: 0.0.55

# styled-components-baseline

__⚡️ This package is in active development, and --not-- fit for production yet.__

Responsive modular scalable typographic baseline components for styled-components.

## License

[MIT](LICENSE).
npm package: @spronta/images
Description: Spronta Image CDN — core URL builder, signing, and types
Latest version: 0.1.0

# @spronta/images

Core URL builder, signing, and blurhash utilities for the [Spronta](https://www.spronta.com) image CDN.

Zero dependencies. Works in Node.js, browsers, Deno, Bun, and Cloudflare Workers.

## Install

```bash
npm install @spronta/images
```

## Quick start

```ts
import { Spronta } from "@spronta/images";

const spronta = new Spronta({
  baseUrl: "https://cdn.spronta.com",
  project: "my-project",
});

// Generate a URL
const url = spronta.url("hero.jpg", { width: 800, format: "auto", quality: "medium" });
// → https://cdn.spronta.com/my-project/hero.jpg?w=800&f=auto&q=medium

// Generate responsive srcset
const { src, srcset, sizes } = spronta.srcset("photo.jpg", {
  widths: [400, 800, 1200],
  sizes: "(max-width: 768px) 100vw, 50vw",
});
```

## Signed URLs

```ts
const spronta = new Spronta({
  baseUrl: "https://cdn.spronta.com",
  project: "my-project",
  signingSecret: "spronta_sign_...",
});

const url = await spronta.signedUrl("private.jpg", {
  width: 800,
  expiresIn: 3600, // 1 hour
});
```

## Blurhash

```ts
import { decodeBlurhash, blurhashToCssUrl, blurhashToColor } from "@spronta/images";

// Decode to RGBA pixels
const pixels = decodeBlurhash("LEHV6nWB2y", 32, 32);

// Get a CSS background (canvas data URL in browser, solid color in SSR)
const cssUrl = blurhashToCssUrl("LEHV6nWB2y", 32, 32);

// Extract average color
const hex = blurhashToColor("LEHV6nWB2y"); // → "#a4c3b2"
```

## Transform options

| Option | Type | Description |
|--------|------|-------------|
| `width` | number | Output width (1–8192) |
| `height` | number | Output height (1–8192) |
| `fit` | string | `cover`, `contain`, `fill`, `scale-down`, `crop`, `pad` |
| `format` | string | `auto`, `jpeg`, `png`, `webp`, `avif`, `jxl` |
| `quality` | number \| string | 1–100 or `high`, `medium`, `low` |
| `gravity` | string | `auto`, `face`, `center`, position keywords |
| `blur` | number | Gaussian blur (1–250) |
| `sharpen` | number | Unsharp mask (0–10) |
| `radius` | number \| `"max"` | Corner radius |
| `rotate` | number | 90, 180, 270 |
| `flip` | string | `h`, `v` |
| `preset` | string | Named transform preset |

See [full parameter reference](https://www.spronta.com/docs/transforms) for all options.

## Framework integrations

- **React**: [`@spronta/images-react`](https://github.com/spronta/images-react)
- **Next.js**: [`@spronta/images-next`](https://github.com/spronta/images-next)

## License

[MIT](LICENSE)
npm package: @spronta/images-next
Description: Spronta Image CDN — Next.js integration with next/image loader
Latest version: 0.1.0

# @spronta/images-next

Next.js integration for the [Spronta](https://www.spronta.com) image CDN. Drop-in `next/image` loader and component.

## Install

```bash
npm install @spronta/images @spronta/images-next
```

## Option 1: Custom loader (global)

Create a loader file and reference it in `next.config.ts`:

```ts
// lib/spronta-loader.ts
import { createSprontaLoader } from "@spronta/images-next";

export default createSprontaLoader({
  baseUrl: "https://cdn.spronta.com",
  project: "my-project",
});
```

```ts
// next.config.ts
const config = {
  images: {
    loaderFile: "./lib/spronta-loader.ts",
  },
};
```

Now every `<Image>` in your app automatically uses the Spronta CDN.

## Option 2: Component (per-image)

```tsx
import { SprontaNextImage } from "@spronta/images-next";

<SprontaNextImage
  baseUrl="https://cdn.spronta.com"
  project="my-project"
  path="hero.jpg"
  alt="Hero"
  width={1200}
  height={800}
  blurhash="LEHV6nWB2y"
  priority
/>
```

`<SprontaNextImage>` wraps `next/image` with:
- Inline loader routing through the Spronta CDN
- Blurhash → SVG blur placeholder via `blurDataURL`
- All standard `next/image` props (`priority`, `fill`, `sizes`, `quality`)

## Requirements

- Next.js 14+
- React 18+
- `@spronta/images` (core SDK)

## License

[MIT](LICENSE)
npm package: @spronta/images-react
Description: Spronta Image CDN — React components with blurhash placeholders
Latest version: 0.1.0

# @spronta/images-react

React components for the [Spronta](https://www.spronta.com) image CDN. Responsive images with automatic srcset generation and blurhash placeholders.

## Install

```bash
npm install @spronta/images @spronta/images-react
```

## Quick start

```tsx
import { Spronta } from "@spronta/images";
import { SprontaProvider, SprontaImage } from "@spronta/images-react";

const client = new Spronta({
  baseUrl: "https://cdn.spronta.com",
  project: "my-project",
});

function App() {
  return (
    <SprontaProvider client={client}>
      <SprontaImage
        path="hero.jpg"
        alt="Hero image"
        widths={[400, 800, 1200]}
        sizes="(max-width: 768px) 100vw, 50vw"
        blurhash="LEHV6nWB2y"
        width={1200}
        height={800}
      />
    </SprontaProvider>
  );
}
```

## Components

### `<SprontaProvider>`

Wrap your app once to provide the Spronta client to all `<SprontaImage>` components.

```tsx
<SprontaProvider client={sprontaClient}>
  {children}
</SprontaProvider>
```

### `<SprontaImage>`

Renders a responsive `<img>` with automatic srcset, format negotiation, and blurhash placeholder.

| Prop | Type | Description |
|------|------|-------------|
| `path` | string | Image path on the CDN |
| `alt` | string | Alt text (required) |
| `transforms` | object | Transform options (width, height, fit, etc.) |
| `widths` | number[] | Srcset breakpoints |
| `sizes` | string | Sizes attribute |
| `blurhash` | string | Blurhash string for placeholder |
| `width` | number | Intrinsic width |
| `height` | number | Intrinsic height |
| `loading` | string | `lazy` (default) or `eager` |

### How it works

1. Generates `src` + `srcset` via the core SDK
2. Decodes blurhash to a 32px canvas placeholder
3. Fades in the actual image on load

## Requirements

- React 18+
- `@spronta/images` (core SDK)

## License

[MIT](LICENSE)
npm package: @spronta/sdk
Description: Spronta CMS client SDK — fetch content from the Spronta platform or local files
Latest version: 0.0.1

# @spronta/sdk

Client SDK for the [Spronta](https://www.spronta.com) CMS. Fetch content from the Spronta platform or local files.

## Install

```bash
npm install @spronta/sdk
```

## Quick start

```ts
import { createClient } from "@spronta/sdk";

const client = createClient({
  projectId: "your-project-id",
  apiKey: "your-api-key",
});

// Fetch a page
const page = await client.getEntry("home");

// List entries by content model
const posts = await client.listEntries("blog-post");
```

## Modes

The SDK supports two data sources controlled by `SPRONTA_SOURCE`:

- **`api`** (default) — fetches from the Spronta platform API
- **`local`** — reads from local JSON files (for static site generation)

```bash
# .env
SPRONTA_SOURCE=local
```

## React

```tsx
import { SprontaContent } from "@spronta/sdk/react";

<SprontaContent entry={page} />
```

## License

[MIT](LICENSE)
npm package: @sprout-idws/sprout-base
Description: Shared base utilities for Sprout (logger config, etc.)
Author: Sprout
Latest version: 1.0.2

# @sprout-idws/sprout-base

Small **shared utilities** for Sprout NestJS applications. Today this package focuses on **Nest logger level** selection from the environment.

## Purpose

- Centralize conventions (for example log verbosity) so multiple services behave the same way without duplicating env parsing.

## Installation

```bash
npm install @sprout-idws/sprout-base
```

Peer dependency: `@nestjs/common` (v10+).

## Functionality

### `LoggerConfig`

Maps `process.env.LOG_LEVEL` to Nest `LogLevel[]` for `NestFactory.create(..., { logger: ... })` or similar.

| `LOG_LEVEL` | Behavior |
|-------------|----------|
| *(unset)* | `warn`, `log`, `error` |
| `all` | `error`, `warn`, `log`, `debug`, `verbose` |
| Comma-separated | Any subset of `error`, `warn`, `log`, `debug`, `verbose` (invalid tokens ignored) |

Example:

```typescript
import { NestFactory } from '@nestjs/core';
import { LoggerConfig } from '@sprout-idws/sprout-base';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: LoggerConfig.getLoggerLevels(),
  });
  await app.listen(3000);
}
bootstrap();
```

## Build

This package ships compiled `dist/` output. In this monorepo, `npm run build` at the repo root runs Turbo and builds all workspaces.

## Repository

Published from the [`sprout-typescript-backend`](https://github.com/sprout-libs/sprout-typescript-backend) monorepo (`packages/sprout-base`).
npm package: @sprout-idws/sprout-config-loader
Description: Reusable NestJS config loader: loads config and secret files from directories into process.env
Author: Sprout
Latest version: 1.0.1

# @sprout-idws/sprout-config-loader

NestJS module that **loads configuration and secret files from directories** into `process.env` before (and alongside) `ConfigModule`, matching how Sprout deploys apps with Docker configs and secrets mounted as files.

## Purpose

- In **Swarm / Sprout** deployments, values often arrive as files under `/run/configs` and `/run/secrets`, not only as a single `.env` file.
- This package reads those directories once at startup and exposes the same values through Nest `ConfigService` by merging them into the config layer loaded by `ConfigModule.forRoot`.

## Installation

```bash
npm install @sprout-idws/sprout-config-loader @nestjs/config
```

Peer dependencies: `@nestjs/common`, `@nestjs/config` (v10+ / v3+ respectively).

## Environment variables

| Variable | Default | Meaning |
|----------|---------|---------|
| `CONFIGS_BASE_PATH` | `/run/configs` | Directory of non-secret files (one file per key) |
| `SECRETS_BASE_PATH` | `/run/secrets` | Directory of secret files (one file per key) |

Each **file name** is normalized to an env key: non-alphanumeric characters become `_`, then the key is uppercased (for example `DATABASE_HOST` from a file named `DATABASE_HOST`).

If a key **already exists** in `process.env`, the file value is **not** applied (env wins).

## Usage

Register early in your root module (typically global):

```typescript
import { Module } from '@nestjs/common';
import { ConfigLoaderModule } from '@sprout-idws/sprout-config-loader';

@Module({
  imports: [
    ConfigLoaderModule.forRoot({
      envFilePath: '.env', // optional; passed to ConfigModule.forRoot
      isGlobal: true,      // default true
    }),
  ],
})
export class AppModule {}
```

`ConfigLoaderModule.forRoot`:

- Imports `ConfigModule.forRoot` with `load: [() => ConfigLoaderService.loadConfigFiles()]`.
- Exports `ConfigModule` so `ConfigService` sees file-backed values where not overridden.

### Local development

Point `CONFIGS_BASE_PATH` / `SECRETS_BASE_PATH` at local folders with plain files named like production keys (same layout as in containers).

## Exports

- `ConfigLoaderModule`, `ConfigLoaderModuleOptions`
- `ConfigLoaderService` (static `loadConfigFiles()` used by the module loader)

## Repository

[`sprout-typescript-backend`](https://github.com/sprout-libs/sprout-typescript-backend) — `packages/sprout-config-loader`.
npm package: @sprout-idws/sprout-context
Description: Reusable NestJS request context (AsyncLocalStorage) for auth and propagation
Author: Sprout
Latest version: 1.0.2

# @sprout-idws/sprout-context

**Request-scoped context** for NestJS using Node’s `AsyncLocalStorage`: store and read `userId`, `roles`, and related auth data for the current HTTP request without explicit parameter threading.

## Purpose

- Share authentication context with services, guards, and interceptors deep in the call stack.
- Encode/decode context for propagation (for example across internal boundaries) via base64 JSON helpers.

## Installation

```bash
npm install @sprout-idws/sprout-context
```

Peer dependency: `@nestjs/common` (v10+).

## Usage

### 1. Register the global module

```typescript
import { Module } from '@nestjs/common';
import { ContextModule } from '@sprout-idws/sprout-context';

@Module({
  imports: [ContextModule],
})
export class AppModule {}
```

`ContextModule` is `@Global()` and provides `ContextService` and `ContextMiddleware`.

### 2. Apply the middleware

Mount `ContextMiddleware` on your HTTP app (for example in `main.ts`) so each request runs inside a context store. [`@sprout-idws/sprout-nestjs-application`](../sprout-nestjs-application/README.md) applies this middleware when you use `SproutApiApplicationModule`.

### 3. Use `ContextService`

- `run(context, callback)` — execute code with a fresh ALS store.
- `set(partial)` — merge into the current store (or `enterWith` if none).
- `getContext()` / `getRequiredContext()` — read `AuthContext`; required variant throws `UnauthorizedException` if missing.
- `getCurrentEncodedContext()` / `getDecodedContext` / `getEncodedContext` — serialize `AuthContext` as base64 JSON for optional propagation.

`AuthContext` shape:

```ts
interface AuthContext {
  userId?: string;
  roles?: string[];
}
```

## Relationship to other Sprout packages

- **`@sprout-idws/sprout-nestjs-application`** — JWT guard sets context after successful auth.
- **`@sprout-idws/sprout-redis`** — depends on `ContextModule` for user-scoped behavior where applicable.

## Repository

[`sprout-typescript-backend`](https://github.com/sprout-libs/sprout-typescript-backend) — `packages/sprout-context`.
npm package: @sprout-idws/sprout-crypto
Description: NestJS crypto service for AES-256-GCM encryption/decryption
Author: Sprout
Latest version: 1.0.1

# @sprout-idws/sprout-crypto

NestJS **AES-256-GCM** encryption and decryption service keyed from configuration—useful for protecting sensitive payloads at rest or in transit within your domain (not a substitute for TLS or Swarm secrets for infrastructure credentials).

## Purpose

- Provide a single injectable `CryptoService` with `encrypt` / `decrypt` using Node `crypto`:
  - Algorithm: **AES-256-GCM**
  - Key: `scryptSync(ENCRYPTION_SECRET, 'salt', 32)`
  - Ciphertext format: base64-encoded `iv || authTag || ciphertext`

## Installation

```bash
npm install @sprout-idws/sprout-crypto @nestjs/config
```

Peer dependencies: `@nestjs/common`, `@nestjs/config` (v10+ / v3+).

## Configuration

| Variable | Required | Description |
|----------|----------|-------------|
| `ENCRYPTION_SECRET` | Yes | Secret string used to derive the 32-byte key. If unset, `CryptoService` throws at construction time. |

## Usage

```typescript
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { CryptoModule } from '@sprout-idws/sprout-crypto';

@Module({
  imports: [ConfigModule, CryptoModule],
})
export class AppModule {}
```

```typescript
import { Injectable } from '@nestjs/common';
import { CryptoService } from '@sprout-idws/sprout-crypto';

@Injectable()
export class TokensService {
  constructor(private readonly crypto: CryptoService) {}

  seal(plain: string) {
    return this.crypto.encrypt(plain);
  }

  open(sealed: string) {
    return this.crypto.decrypt(sealed);
  }
}
```

## Security notes

- Treat `ENCRYPTION_SECRET` like any other application secret (Swarm secret, vault, etc.).
- The module uses a **fixed salt** in code for key derivation; rotating secrets requires a migration strategy for existing ciphertext.

## Repository

[`sprout-typescript-backend`](https://github.com/sprout-libs/sprout-typescript-backend) — `packages/sprout-crypto`.
npm package: @sprout-lab/grow
Description: 🌱 @sprout-lab application boilerplate generator
Latest version: 1.3.6

# 🌱 @sprout-lab/grow 
A zero-config CLI for growing production-ready [@sprout-lab](https://github.com/sprout-lab) projects.

## ✨ Features
- Haiku-style default project names
- Interactive prompts for setup
- File templating via Eta 
- Optional pnpm install & vitest test run 
- Git repo auto-init

## 🚀 Usage
```bash
pnpx @sprout-lab/grow
```
You’ll be prompted to:
- Name your project
- Choose a project type (currently supports TypeScript)
- Add a description
- Optionally install dependencies and run tests

## 🗂 Templates
Templates live in the templates/ folder and are customizable. Extend them to support other stacks or org standards.

## 🛠 Development
```
pnpm install
pnpm build
pnpm link
grow
```

## 📦 Releasing
Handled via semantic-release on GitHub Actions. Just push conventional commits to main.

## 🌿 License
MIT – make things grow.