Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added templates/clerq/assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added templates/clerq/assets/screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
57 changes: 57 additions & 0 deletions templates/clerq/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import {
Output,
randomPassword,
randomString,
Services,
} from "~templates-utils";
import { Input } from "./meta";

export function generate(input: Input): Output {
const services: Services = [];
const databasePassword = randomPassword();
const authSecret = randomString(32);
const databaseUrl = `postgresql://postgres:${databasePassword}@$(PROJECT_NAME)_${input.appServiceName}-db:5432/$(PROJECT_NAME)`;

const env = [
`DATABASE_URL=${databaseUrl}`,
`BETTER_AUTH_SECRET=${authSecret}`,
`BETTER_AUTH_URL=https://$(PRIMARY_DOMAIN)`,
];

if (input.googleClientId && input.googleClientSecret) {
env.push(`GOOGLE_CLIENT_ID=${input.googleClientId}`);
env.push(`GOOGLE_CLIENT_SECRET=${input.googleClientSecret}`);
}

if (input.groqApiKey) {
env.push(`GROQ_API_KEY=${input.groqApiKey}`);
}

services.push({
type: "app",
data: {
serviceName: input.appServiceName,
source: {
type: "image",
image: input.appServiceImage,
},
domains: [
{
host: "$(EASYPANEL_DOMAIN)",
port: 3000,
},
],
env: env.join("\n"),
},
});

services.push({
type: "postgres",
data: {
serviceName: `${input.appServiceName}-db`,
password: databasePassword,
},
});

return { services };
}
110 changes: 110 additions & 0 deletions templates/clerq/meta.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
name: Clerq
description:
Clerq is an open-source, self-hostable back office platform that automates the
administrative work for freelancers and small development studios, so you can
spend less time on busywork and more time on billable work. It connects the
whole workflow, from time tracking through invoice generation to payment
recording, eliminating manual data transfer between tools. Clerq offers time
tracking with a live timer and manual logging, full client management with
records and contacts, project management with Kanban and list views, and
multi-currency invoicing with automatic exchange rates, VAT handling, and
branded PDF invoices. Expense tracking supports receipt uploads and
categorization, with optional AI receipt scanning. Built on Next.js, Better
Auth, and PostgreSQL, Clerq applies its database migrations automatically on
first boot and keeps you in full control of your data.
instructions: |
Required configuration is generated for you: a PostgreSQL database, a random
BETTER_AUTH_SECRET, and the DATABASE_URL wiring between them. BETTER_AUTH_URL
is set to your attached domain and is used for authentication
callbacks/redirects, so deploy with a domain attached. On first boot the
container applies the database migrations and starts serving, then you can
create your account from the sign-up page.

Optional integrations: set Google OAuth (Client ID/Secret) to enable
"Sign in with Google", and set a Groq API key to enable AI receipt scanning on
the expenses form. Leave these blank to keep the corresponding buttons hidden.
changeLog:
- date: 2026-06-28
description: First release
links:
- label: Website
url: https://useclerq.net
- label: Documentation
url: https://useclerq.net/docs/self-hosting/easypanel
- label: GitHub
url: https://github.com/punterdigital/clerq
- label: Container registry (GHCR)
url: https://github.com/punterdigital/clerq/pkgs/container/clerq

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoid adding any other link except Github, Website and Docs

contributors:
- name: Shay Punter
url: https://github.com/ShayPunter
schema:
type: object
required:
- appServiceName
- appServiceImage
properties:
appServiceName:
type: string
title: App Service Name
default: clerq
appServiceImage:
type: string
title: App Service Image
default: ghcr.io/punterdigital/clerq:1.3.0
googleClientId:
type: string
title: Google OAuth Client ID (optional)
description:
Enables "Sign in with Google". Leave blank to hide the button.
googleClientSecret:
type: string
title: Google OAuth Client Secret (optional)
description: Required together with the Google OAuth Client ID.
groqApiKey:
type: string
title: Groq API Key (optional)
description:
Enables AI receipt scanning on the expenses form. Leave blank to hide
the button.
benefits:
- title: Less back office, more billable work
description:
Clerq automates the administrative work for freelancers and small studios,
connecting time tracking, invoicing, and payments into one workflow so
nothing is re-entered by hand.
- title: Self-hosted and in your control
description:
Run Clerq on your own infrastructure with a PostgreSQL database you own,
keeping full control of your client, invoice, and financial data.
- title: Quick to deploy
description:
The published image applies its own database migrations on first boot, so
the stack is ready to use minutes after deploying.
features:
- title: Time tracking
description:
Track billable time with a live timer or manual logging, then turn it
straight into invoices.
- title: Client & project management
description:
Keep full client records and contacts, and organize work with Kanban and
list views.
- title: Multi-currency invoicing
description:
Generate branded PDF invoices with automatic exchange rates and VAT
handling across currencies.
- title: Expense tracking
description:
Upload and categorize receipts, with optional AI receipt scanning powered
by Groq.
- title: Authentication
description:
Email/password sign-in via Better Auth, with optional Google OAuth.
tags:
- Invoicing
- Time Tracking
- Freelance
- Self-hosted
- Next.js
- PostgreSQL
14 changes: 14 additions & 0 deletions templates/list.json

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't really think if this file is needed.

Original file line number Diff line number Diff line change
Expand Up @@ -1207,6 +1207,20 @@
"Open Source"
]
},
{
"slug": "clerq",
"logo": "logo.png",
"name": "Clerq",
"description": "Clerq is an open-source, self-hostable back office platform that automates the administrative work for freelancers and small development studios, so you can spend less time on busywork and more time on billable work. It connects the whole workflow, from time tracking through invoice generation to payment recording, eliminating manual data transfer between tools. Clerq offers time tracking with a live timer and manual logging, full client management with records and contacts, project management with Kanban and list views, and multi-currency invoicing with automatic exchange rates, VAT handling, and branded PDF invoices. Expense tracking supports receipt uploads and categorization, with optional AI receipt scanning. Built on Next.js, Better Auth, and PostgreSQL, Clerq applies its database migrations automatically on first boot and keeps you in full control of your data.",
"tags": [
"Invoicing",
"Time Tracking",
"Freelance",
"Self-hosted",
"Next.js",
"PostgreSQL"
]
},
{
"slug": "clickhouse",
"logo": "logo.png",
Expand Down