FRMWRK
Next.js Boilerplate
Build tools with AI

Integrations

Pre-built clients for common services. Select them during /new-tool or add them manually.

GitLab

lib/integrations/gitlab.ts

Read repositories, branches, merge requests, CI/CD pipelines, and issues. Authenticated with a personal access token.

Use cases

  • List open merge requests across projects
  • Trigger CI pipelines programmatically
  • Read file contents from a branch
  • Post comments on issues or MRs

Environment variables

GITLAB_URLGITLAB_TOKEN
// GITLAB_URL=https://gitlab.com
// GITLAB_TOKEN=glpat-...

import { gitlabClient } from '@/lib/integrations/gitlab'

const mrs = await gitlabClient.mergeRequests.list({ projectId: 42, state: 'opened' })
const file = await gitlabClient.files.get({ projectId: 42, path: 'README.md', ref: 'main' })

Slack

lib/integrations/slack.ts

Send messages to channels or users using a bot token, or post to a webhook URL.

Use cases

  • Send a message when a job completes
  • Post a daily digest to a channel
  • Alert on errors or threshold breaches

Environment variables

SLACK_BOT_TOKENSLACK_WEBHOOK_URL
// SLACK_BOT_TOKEN=xoxb-...
// SLACK_WEBHOOK_URL=https://hooks.slack.com/...

import { slackClient } from '@/lib/integrations/slack'

await slackClient.postMessage({ channel: '#deployments', text: '✅ Deploy complete' })
await slackClient.postWebhook({ text: 'New submission received' })

Atlassian

lib/integrations/atlassian.ts

Read and write Jira issues and Confluence pages. Authenticated with email + API token (basic auth).

Use cases

  • Create Jira tickets from form submissions
  • Read issue status to show in a dashboard
  • Post comments on Confluence pages
  • Search issues with JQL

Environment variables

ATLASSIAN_BASE_URLATLASSIAN_EMAILATLASSIAN_API_TOKEN
// ATLASSIAN_BASE_URL=https://yourorg.atlassian.net
// ATLASSIAN_EMAIL=you@example.com
// ATLASSIAN_API_TOKEN=...

import { atlassianClient } from '@/lib/integrations/atlassian'

const issue = await atlassianClient.jira.createIssue({ summary: 'Bug report', type: 'Bug' })
const page  = await atlassianClient.confluence.getPage({ pageId: '123456' })

Personio

lib/integrations/personio.ts

Read employee data, attendance, and absences from Personio HR. Authenticated with OAuth2 client credentials.

Credentials are generated in Personio under Settings → Integrations → API credentials. You must whitelist the specific employee attributes (e.g. email, department) in the credentials wizard before they appear in API responses.

Use cases

  • List employees and their departments
  • Read absence/leave records
  • Fetch attendance and time tracking data
  • Build an internal HR dashboard

Environment variables

PERSONIO_CLIENT_IDPERSONIO_CLIENT_SECRET
// PERSONIO_CLIENT_ID=...
// PERSONIO_CLIENT_SECRET=...

import { personioClient } from '@/lib/integrations/personio'

const employees = await personioClient.employees.list()
const absences  = await personioClient.absences.list({ startDate: '2024-01-01' })

Simplicate

lib/integrations/simplicate.ts

Read employees, projects, hours, and CRM data from Simplicate. Authenticated with API key + secret (HMAC header auth).

API credentials are found in Simplicate under Instellingen → Koppelingen → API. You need the subdomain, API key, and API secret.

Use cases

  • Read project hours and budgets
  • List employees and their roles
  • Fetch CRM contacts and relations
  • Build a time tracking overview

Environment variables

SIMPLICATE_SUBDOMAINSIMPLICATE_API_KEYSIMPLICATE_API_SECRET
// SIMPLICATE_SUBDOMAIN=yourorg   (from yourorg.simplicate.nl)
// SIMPLICATE_API_KEY=...
// SIMPLICATE_API_SECRET=...

import { simplicateClient } from '@/lib/integrations/simplicate'

const projects = await simplicateClient.projects.list()
const hours    = await simplicateClient.hours.list({ projectId: 'p:abc123' })

Custom API

lib/integrations/<name>.ts

Add any API not listed above. The /new-tool questionnaire will ask you to describe it; the AI scaffolds a typed client stub.

Use cases

  • Any REST or GraphQL API
  • Internal microservices
  • Third-party SaaS with an API

Environment variables

CUSTOM_API_BASE_URLCUSTOM_API_KEY
// lib/integrations/myservice.ts
const BASE_URL = process.env.MYSERVICE_BASE_URL ?? ''
const API_KEY  = process.env.MYSERVICE_API_KEY  ?? ''

async function request<T>(path: string, options?: RequestInit): Promise<T> {
  const res = await fetch(`${BASE_URL}${path}`, {
    ...options,
    headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json', ...options?.headers },
  })
  if (!res.ok) throw new Error(`[MyService] ${res.status} ${res.statusText}`)
  return res.json()
}

export const myServiceClient = {
  items: { list: () => request<Item[]>('/items') },
}