JJourney AI

Setup

Install, configure and connect the API, the admin panel and the site template locally.

Updated 27 October 20268 min read

On this page you'll learn how to install the three parts of Journey AI on your own machine, how to configure each one and how to connect them.

PartRepositoryTechnologyLocal address
APIsameup-cms.NET 10, EF Core, SQL Serverhttp://localhost:5235
Admin paneljourney-v2React 19, Vite, npmhttp://localhost:5173
Site templateCms-Landing-CoreNext.js 16, pnpmhttp://localhost:3000

The order matters: API first, then the panel, then the site. The panel and the site read from the API; neither opens without it.

Prerequisites

ToolVersionFor
.NET SDK10.0.400 or later (global.json)API
SQL ServerAny SQL Server you can reachAPI
DockerCurrent versionThe API's helper services (file storage, optional Redis)
Node.js24 or laterPanel
Node.js22 or laterSite template
pnpmCurrent versionSite template (npm and yarn are blocked)

You provide SQL Server

The Docker files in the repositories have no SQL Server service. Install a local SQL Server or run one in a container; the API only needs the connection string.

1. API

Clone and build

Terminal
git clone <sameup-cms> && cd sameup-cms
dotnet build

The solution file is sameup-cms.slnx. The project you run is SameUp.CMS.API; the database layer is SameUp.CMS.Data.

Start the helper services

The API keeps files in an object store. Locally, use the MinIO service in docker-compose.local.yml:

Terminal
export MINIO_ACCESS_KEY=<access-key> MINIO_SECRET_KEY=<secret-key>
docker compose -f docker-compose.local.yml up -d minio redis
ServicePortRequired
minio9000, console 9001Yes (or AWS S3 / Azure Blob)
redis6379No; without it the API uses an in-memory cache
kafka, kafka-ui9092, 8081No; only for shipping logs

Create the bucket the API will use in the MinIO console (http://localhost:9001).

Configure

The API reads its settings from SameUp.CMS.API/appsettings.json and from environment variables. In environment variables, use __ as the section separator: ConnectionStrings:SqlConnection → ConnectionStrings__SqlConnection.

Required settings:

KeyPurpose
ConnectionStrings:SqlConnectionSQL Server connection string. The database is created on first start if it doesn't exist.
Documents:ActiveFileServerFile storage: MinIO, AWS or AzureBlobStorage. Any other value stops the API from starting.
Documents:FileServers:MinIO:*Settings for the storage you chose: AccessKey, SecretKey, BucketName, Host, UseSSL, CDNUrl and so on. AWS and Azure have their own blocks under the same path.
Jwt:KeySecret key that signs session tokens. Give every installation its own long, random value. Set Jwt:Issuer and Jwt:Audience for the installation too.
OriginsAddresses allowed to call the API from a browser (CORS), such as the panel: Origins__0=http://localhost:5173. If empty, the panel can't connect to the API.
Operational:TokenSecret key for the maintenance endpoints. Needed to create the first admin user; if empty, these endpoints are off.

Common optional settings:

KeyPurpose
Redis:Enabled, Redis:ConnectionStringRedis cache.
Kafka:LoggingEnabledShips logs to Kafka. Set it to false if you don't run Kafka locally.
Auth:LocalLoginEnabledSign-in with e-mail and password (on by default).
Auth:Sso:*Corporate SSO sign-in. If local sign-in is off, SSO must be configured or the API won't start.
Admin:Cookie:*Domain, Secure and SameSiteMode for the panel's session cookie.
UseSwaggerSwagger UI. Always on in the development environment.
DisableAutoMigrationIf true, database migrations don't run on start.

Don't use the repository's development settings as they are

appsettings.Development.json holds values for a specific environment. Pass your own connection string, keys and addresses through environment variables, and don't commit secrets.

Run

Terminal
dotnet run --project SameUp.CMS.API --urls "http://localhost:5235"

On first start, the API runs the database migrations itself and adds the default application parameters. If the database isn't ready yet, it keeps retrying for five minutes.

To check:

  • GET http://localhost:5235/health: health status.
  • http://localhost:5235/: Swagger UI in the development environment.

Create the first admin user

An empty database has no user who can sign in to the panel. A script in the repository creates the default roles (SuperAdmin, Admin, Editor) and the first admin:

Terminal
export Operational__Token=<value-from-the-api-settings>
export ADMIN_EMAIL=[email protected] ADMIN_PASSWORD=<a-strong-password>
SEED_ROLES=1 ./scripts/dev-admin.sh
  • The script assumes the API runs at http://localhost:5235; change it with API_URL if not.
  • For safety, it only runs against a local database.
  • SEED_ROLES=1 deletes and recreates the existing roles; only use it on an empty database.

2. Admin panel

Clone and install

Terminal
git clone <journey-v2> && cd journey-v2
npm install

Point it at the API

Create a .env.local file in the repository root:

.env.local
VITE_API_URL=http://localhost:5235
VITE_API_BASE_PATH=/api/v1
VariablePurpose
VITE_API_URLThe API's root address. Required.
VITE_API_BASE_PATHAPI path prefix. Default /api/v1.
VITE_API_PROXYDevelopment only: proxies /api requests to this address. Use it if you'd rather not set up CORS.
VITE_ALLOWED_HOSTSAllowed addresses (comma-separated) if you open the panel on a host other than localhost.
VITE_DEV_LOGIN_EMAIL, VITE_DEV_LOGIN_PASSWORDPrefill the sign-in form, in local development only.

The site addresses aren't environment variables in the panel; they're read from the API's application parameters (see Connect the parts).

Run

Terminal
npm run dev        # http://localhost:5173
npm run check      # types, lint and other checks

Sign in with the first admin user.

3. Site template

Terminal
git clone <Cms-Landing-Core> my-site && cd my-site
cp .env.example .env.local
pnpm install
pnpm dev           # http://localhost:3000

For a local setup, set at least these in .env.local:

.env.local
NEXT_PUBLIC_API_URL=http://localhost:5235
NEXT_PUBLIC_SITE_URL=http://localhost:3000
REVALIDATE_ALLOWED_ORIGINS=http://localhost:5173
  • NEXT_PUBLIC_API_URL is the API's root address; don't add /api/v1. If it isn't set or the API can't be reached, you see a setup screen in development.
  • REVALIDATE_ALLOWED_ORIGINS is the panel's address; with it, the panel refreshes the site's cache after saving.
  • The preview site is a second copy of the same template running with PREVIEW_MODE=true.

For all variables, the project structure and component mapping, see Site template.

4. Connect the parts

For the three parts to find each other, these settings must match:

WhoFindsSetting
PanelAPIVITE_API_URL in the panel; the panel's address in the API's Origins.
SiteAPINEXT_PUBLIC_API_URL in the site.
PanelSiteIn the panel, Settings › Connections › Live site address and Preview site address; the panel's address in the site's REVALIDATE_ALLOWED_ORIGINS.

In a local setup, sign in to the panel and set both site addresses to http://localhost:3000 on the Settings › Connections screen. If these addresses are empty or point to another environment, the preview in the component editor and the Refresh cache button go to the wrong site. For details, see Settings.

Common situations

Related pages

On this page