Check Visibility
Check if changelog is visible to the public.
const res = await client.changelog.visible.$get({
slug: "acme"
})
const { visible } = await res.json()
Type: Public Procedure
Whether changelog board is visible and public
Get Settings
Get changelog settings and tags.
const res = await client.changelog.settings.$get({
slug: "acme"
})
const { ok, isVisible, tags } = await res.json()
Type: Private Procedure
Whether changelog is visible
Available changelog tags with counts
Toggle Visibility
Show or hide the changelog board.
const res = await client.changelog.toggleVisibility.$post({
slug: "acme",
isVisible: true
})
Type: Private Procedure (requires board manager permission)
Tag Management
const res = await client.changelog.tagsList.$get({
slug: "acme"
})
const { tags } = await res.json()
Type: Private Procedure
Create Tag
const res = await client.changelog.tagsCreate.$post({
slug: "acme",
name: "Feature",
color: "#3b82f6"
})
Type: Private Procedure (requires board manager permission)
Tag name (1-64 characters)
Plan Limits:
- Free: 5 changelog tags
- Starter: 20 tags
- Professional: Unlimited tags
Delete Tag
const res = await client.changelog.tagsDelete.$post({
slug: "acme",
tagId: "tag-123"
})
Type: Private Procedure (requires board manager permission)
Entry Management
Create Entry
Create a new changelog entry.
const res = await client.changelog.entriesCreate.$post({
slug: "acme",
title: "New Dashboard Design",
content: { /* Tiptap JSON content */ },
summary: "We've redesigned the dashboard for better usability.",
coverImage: "https://example.com/cover.png",
tags: ["tag-id-1", "tag-id-2"],
status: "published" // or "draft"
})
const { ok, entry } = await res.json()
Type: Private Procedure (requires board manager permission)
Brief summary (shown in lists)
“draft” or “published” (default: “draft”)
Plan Limits:
- Free: 10 changelog entries
- Starter: 50 entries
- Professional: Unlimited entries
Update Entry
const res = await client.changelog.entriesUpdate.$post({
slug: "acme",
entryId: "entry-123",
title: "Updated Title",
content: { /* New content */ },
status: "published"
})
const { ok, entry } = await res.json()
Type: Private Procedure (requires board manager permission)
Get Entry (Public)
Get a published changelog entry.
const res = await client.changelog.entriesGet.$get({
slug: "acme",
entrySlug: "new-dashboard-design-abc123"
})
const { entry } = await res.json()
Type: Public Procedure
Get Entry for Edit
const res = await client.changelog.entriesGetForEdit.$get({
slug: "acme",
entryId: "entry-123"
})
const { entry, availableTags } = await res.json()
Type: Private Procedure
Delete Entry
const res = await client.changelog.entriesDelete.$post({
slug: "acme",
entryId: "entry-123"
})
Type: Private Procedure (requires board manager permission)
Publish Entry
Publish a draft entry.
const res = await client.changelog.entriesPublish.$post({
slug: "acme",
entryId: "entry-123"
})
const { ok, entry } = await res.json()
Type: Private Procedure (requires board manager permission)
List Entries (Public)
Get published changelog entries.
const res = await client.changelog.entriesList.$get({
slug: "acme",
limit: 10,
offset: 0
})
const { entries, total } = await res.json()
Type: Public Procedure
Number of entries per page (1-50, default: 10)
Offset for pagination (default: 0)
List All Entries (Admin)
Get all entries including drafts.
const res = await client.changelog.entriesListAll.$get({
slug: "acme",
status: "draft", // Optional filter
limit: 20,
offset: 0
})
const { entries, total, availableTags } = await res.json()
Type: Private Procedure
Filter by status (“draft” or “published”)
AI Assistance
Use AI to generate or improve changelog content.
// Generate from prompt
const res = await client.changelog.aiAssist.$post({
slug: "acme",
action: "prompt",
prompt: "We added dark mode and fixed several bugs"
})
const { ok, title, contentMarkdown, summary } = await res.json()
// Format existing content
const res = await client.changelog.aiAssist.$post({
slug: "acme",
action: "format",
title: "Bug Fixes",
contentMarkdown: "fixed login issue, improved performance"
})
// Improve content
const res = await client.changelog.aiAssist.$post({
slug: "acme",
action: "improve",
contentMarkdown: "We made the app faster"
})
// Generate summary
const res = await client.changelog.aiAssist.$post({
slug: "acme",
action: "summary",
title: "Major Update",
contentMarkdown: "Long detailed changelog content..."
})
Type: Private Procedure (requires board manager permission)
AI action: “prompt”, “format”, “improve”, or “summary”
User prompt (for “prompt” action)
Current content in Markdown
Generated/improved title (for “prompt” action)
Generated/improved content in Markdown
Generated summary (for “prompt” or “summary” actions)
Notra Integration
Get Notra Connection
const res = await client.changelog.notraConnectionGet.$get({
slug: "acme"
})
const { connected, organizationId, canStore } = await res.json()
Type: Private Procedure
Save Notra Connection
const res = await client.changelog.notraConnectionSave.$post({
slug: "acme",
organizationId: "org-123",
apiKey: "notra-api-key"
})
Type: Private Procedure (requires board manager permission)
API keys are encrypted before storage using NOTRA_CREDENTIALS_ENCRYPTION_KEY.
Delete Notra Connection
const res = await client.changelog.notraConnectionDelete.$post({
slug: "acme"
})
Type: Private Procedure
Import from Notra
Import changelog entries from Notra.
const res = await client.changelog.importFromNotra.$post({
slug: "acme",
useStoredConnection: true,
status: ["published", "draft"],
limit: 50,
maxPages: 10,
mode: "upsert", // or "create_only"
publishBehavior: "draft_only" // or "keep_status"
})
const { ok, summary } = await res.json()
Type: Private Procedure (requires board manager permission)
Use stored credentials (default: false)
Notra organization ID (if not using stored)
Notra API key (if not using stored)
Status to import ([“published”, “draft”])
Entries per page (default: 50)
Max pages to fetch (default: 10)
“upsert” (update existing) or “create_only”
“draft_only” (import as drafts) or “keep_status”
Entries truncated (plan limit)
Whether used stored credentials