Skip to main content

Configuration

Permify Toolkit uses a single permify.config.ts file as the source of truth for your Permify connection, schema, and tenant. This config is shared between the CLI, NestJS module, and any standalone usage.

Config File

Create permify.config.ts in your project root:

import {
defineConfig,
schema,
entity,
relation,
permission
} from "@permify-toolkit/core";

export default defineConfig({
tenant: "t1",
client: {
endpoint: "localhost:3478",
insecure: true
},
schema: schema({
user: entity({}),
document: entity({
relations: {
owner: relation("user"),
editor: relation("user")
},
permissions: {
edit: permission("owner", "editor"),
view: permission("owner", "editor")
}
})
})
});

Creating a Client

import {
createPermifyClient,
clientOptionsFromEnv
} from "@permify-toolkit/core";

// Reads from PERMIFY_ENDPOINT, PERMIFY_INSECURE, etc.
const client = createPermifyClient(clientOptionsFromEnv());

Supported environment variables:

VariableDescriptionExample
PERMIFY_ENDPOINTPermify server endpointlocalhost:3478
PERMIFY_INSECUREUse insecure connectiontrue / false
PERMIFY_TLS_CERTPath to TLS certificate file/path/to/cert.pem
PERMIFY_TLS_KEYPath to TLS key file/path/to/key.pem
PERMIFY_TLS_CAPath to CA certificate file/path/to/ca.pem
PERMIFY_AUTH_TOKENPermify access tokenyour-token

You can also use a custom prefix:

// Reads from MY_APP_ENDPOINT, MY_APP_INSECURE, etc.
const client = createPermifyClient(clientOptionsFromEnv("MY_APP_"));

Option 2: Manual Configuration

import * as fs from "fs";
import { createPermifyClient } from "@permify-toolkit/core";

const client = createPermifyClient({
endpoint: "permify.internal:3478",
insecure: false,
tls: {
cert: fs.readFileSync("cert.pem"),
key: fs.readFileSync("key.pem"),
ca: fs.readFileSync("ca.pem")
},
interceptor: { authToken: "YOUR_TOKEN" },
timeoutMs: 60000
});

Client Options Reference

OptionTypeDescriptionRequiredDefault
endpointstringPermify server endpoint (host:port)Yes-
insecurebooleanUse insecure connection (no SSL/TLS)Nofalse
tls.certBufferTLS certificateNo-
tls.keyBufferTLS private keyNo-
tls.caBufferCA certificateNo-
interceptor.authTokenstringAuth token for requestsNo-
timeoutMsnumberRequest timeout in millisecondsNo-

Schema Definition Options

Inline Schema (TypeScript DSL)

Define schemas with full type safety and IDE autocompletion:

import { schema, entity, relation, permission } from "@permify-toolkit/core";

const mySchema = schema({
user: entity({}),
document: entity({
relations: {
owner: relation("user"),
viewer: relation("user")
},
permissions: {
edit: permission("owner"),
view: permission("viewer or owner")
}
})
});

File-based Schema

Reference an external .perm file:

import { defineConfig, schemaFile } from "@permify-toolkit/core";

export default defineConfig({
tenant: "t1",
client: { endpoint: "localhost:3478", insecure: true },
schema: schemaFile("./schema.perm")
});

Example schema.perm:

entity user {}

entity organization {
relation member @user
permission view = member
}

entity document {
relation owner @user
relation parent @organization
permission view = owner or parent.view
permission edit = owner
}

Relationship Seeding Config

You can configure relationship seeding in the config file:

export default defineConfig({
// ...client and schema config
relationships: {
seedFile: "./relationships.json",
mode: "append" // "append" (default) or "replace"
}
});