Skip to main content

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
slug
string
required
Workspace slug
visible
boolean
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
isVisible
boolean
Whether changelog is visible
tags
array
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)
slug
string
required
Workspace slug
isVisible
boolean
required
New visibility state

Tag Management

List Tags

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)
slug
string
required
Workspace slug
name
string
required
Tag name (1-64 characters)
color
string
Hex color code
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)
slug
string
required
Workspace slug
title
string
required
Entry title
content
object
required
Tiptap JSON content
summary
string
Brief summary (shown in lists)
coverImage
string
Cover image URL
tags
string[]
Tag IDs to assign
status
string
“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
entry
object | null

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
slug
string
required
Workspace slug
limit
number
Number of entries per page (1-50, default: 10)
offset
number
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
status
string
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)
slug
string
required
Workspace slug
action
string
required
AI action: “prompt”, “format”, “improve”, or “summary”
prompt
string
User prompt (for “prompt” action)
title
string
Current title
contentMarkdown
string
Current content in Markdown
title
string
Generated/improved title (for “prompt” action)
contentMarkdown
string
Generated/improved content in Markdown
summary
string
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)
slug
string
required
Workspace slug
useStoredConnection
boolean
Use stored credentials (default: false)
organizationId
string
Notra organization ID (if not using stored)
apiKey
string
Notra API key (if not using stored)
status
string[]
Status to import ([“published”, “draft”])
limit
number
Entries per page (default: 50)
maxPages
number
Max pages to fetch (default: 10)
mode
string
“upsert” (update existing) or “create_only”
publishBehavior
string
“draft_only” (import as drafts) or “keep_status”
summary
object

Build docs developers (and LLMs) love