---
title: "@playstack/feedback"
description: "Durable intake contract for product feedback and failed-command reports sent by the CLI."
tags: ["package","events-operations","feedback","cli","paid"]
---

{/* package-access:start */}

> **Paid.** Covered by the Playstack Pro License; access and tier assignment are not yet announced. See [package access](/docs/packages#access-policy).

{/* package-access:end */}

`@playstack/feedback` defines the schema-version-1 report that `playstack feedback` sends, a framework-neutral intake policy with validation, per-address limiting and address hashing, the `FeedbackStore` port with memory and Prisma implementations, and the `feedback.report.received` event. It is not ticketing and not telemetry: nothing is sent without an explicit client action, the intake never reads reports back, and it never sends mail.

{/* package-install:start */}

## Install

After confirming [preview access](/docs/packages#access-policy), install the package at your application's shared Playstack version:

```sh
npm install --save-exact @playstack/feedback@0.1.0-beta.1
```

Check the peer requirements below before choosing a runtime or provider.

{/* package-install:end */}

## Compose the intake

```ts
import { createFeedbackIntake } from '@playstack/feedback'
import { PrismaFeedbackStore } from '@playstack/feedback/prisma'
import { PrismaEventOutboxWriter } from '@playstack/events-prisma'

const intake = createFeedbackIntake({
  store: new PrismaFeedbackStore(prisma, { outbox: new PrismaEventOutboxWriter() }),
  limiter: { consume: ({ ip }) => limiter.consume('feedback.ip', { subjects: { ip } }) },
  hashAddress: (ip) => keyedHash(ip),
})

const decision = await intake.limit(ip) // before reading any body
const { id, acceptance } = await intake.accept(body, { ip }) // 'created' | 'duplicate'
```

`accept` throws `FeedbackError('invalid_report')` with path detail for schema failures and never echoes the submitted message. Duplicate ids are acknowledged without a second row or event, so client retries are safe. The report carries a category (`bug`, `idea`, `question`, `other`), the message, optional contact, CLI build identity, runtime facts, and the redacted failure record `playstack feedback --last` attaches.

## Persistence and events

`publish/playstack-feedback.prisma` is the managed database artifact, materialized by `playstack database sync`. `PrismaFeedbackStore` is structurally typed against a generated client and takes the application's outbox writer, so the store and the `feedback.report.received` event commit together. Notification and triage workers consume that event; the intake itself stays write-only.

## Boundary

HTTP lives in [`@playstack/nest-feedback`](/docs/packages/events-operations/nest-feedback). Reading reports back, replying, and closing them are application workflows outside this package.

{/* package-reference:start */}

## API entry points and requirements

Reference snapshot: `@playstack/feedback@0.1.0-beta.1`. Import only the entry point your runtime needs. Paths below are relative to the installed package; use **Go to Definition** in your editor to inspect exact parameters, return types and overloads. Do not import the declaration-file paths directly.

| Public entry point | Declaration file |
| --- | --- |
| `@playstack/feedback` | `./dist/index.d.ts` |
| `@playstack/feedback/errors` | `./dist/errors.d.ts` |
| `@playstack/feedback/prisma` | `./dist/prisma.d.ts` |
| `@playstack/feedback/testing` | `./dist/testing.d.ts` |
| `@playstack/feedback/playstack.artifacts.json` | No TypeScript declaration (asset or metadata export). |
| `@playstack/feedback/package.json` | No TypeScript declaration (asset or metadata export). |

Node.js engine requirement: `>=20`. This is not a claim that every entry point works in browsers or Workers.

### Peer dependencies

This package declares no peer dependencies. Its ordinary dependencies are resolved by the package manager.

For a complete first program, start with [Getting started](/docs/getting-started). For API lookup and partial-example conventions, see [Reading the reference](/docs/packages#reading-the-reference). Provider failures, lifecycle requirements and application responsibilities remain described in the guide above; types alone do not establish production safety.

{/* package-reference:end */}
