Lunogram

Quick Start

Get up and running with Lunogram using Docker Compose

Want to skip the setup?

Get started in minutes with Lunogram Cloud. No infrastructure to maintain.

Try Lunogram Cloud

This guide gets you from zero to a running self-hosted Lunogram instance in under 5 minutes.

Prerequisites: Make sure you have Docker installed and running on your machine.

Install & Run

git clone https://github.com/lunogram/platform.git
cd platform
docker compose up -d

That's it. Lunogram is now running at http://localhost:8080.

Log In

Compose seeds a first administrator account on the first boot. Sign in with it:

FieldValue
Emailadmin@localhost
Passwordchange-this-development-password

The pair is written into a real account with the password hashed, so you can change it from the console like any other. Everybody else who needs access is invited to a project rather than handed these credentials.

Compose also ships a published development signing key for console sessions. Anyone holding it can mint a session for any administrator, so set your own — along with your own first account — before a deployment is reachable by anybody else. See Sign-in.

What's Running

Docker Compose starts everything you need:

ServicePurposePort
LunogramMain application8080
PostgreSQLDatabase5432
RedisCaching6379
NATSEvent streaming4222
MailpitLocal mail catcher8025

Password resets and project invitations are sent by the platform itself, so a deployment has to say where its mail goes. Compose points it at Mailpit: every message is readable at http://localhost:8025, nothing leaves your machine, and no SMTP account is needed. Point it at a real relay before production — see Sending mail.

Your First Campaign

Once logged in, you'll go through a quick onboarding to create your first project. Then:

Integrate Your App

Start tracking users and events:

npm install @lunogram/js-sdk
import { Lunogram } from "@lunogram/js-sdk";

const lunogram = new Lunogram(
  "<session-token>", // minted by your backend — see Settings → Access
  "http://localhost:8080/api",
);

await lunogram.user.upsert({
  identifier: [{ externalId: "user_123" }],
  email: "user@example.com",
});
await lunogram.user.events.post([{ name: "user.signed_up" }]);

On this page