Skip to main content
This page is part of an AI coding agent skill and is written for agents, not humans. For the human-readable Base44 docs, see the developer documentation.

Creating Entities

Base44 entities are defined locally in your project and then pushed to the Base44 backend.

Critical: File Naming

Entity files MUST use kebab-case naming: {kebab-case-name}.jsonc WRONG: TeamMember.jsonc, teamMember.jsonc RIGHT: team-member.jsonc

Table of Contents

Entity Directory

All entity definitions must be placed in the base44/entities/ folder in your project root. Each entity is defined in its own .jsonc file. Example structure:

How to Create an Entity

  1. Create a new .jsonc file in the base44/entities/ directory
  2. Define your entity schema following the structure below
  3. Push the changes to Base44 using the CLI

Entity Schema Structure

Each entity file follows a JSON Schema-like structure:

Common Mistake: Nested Schema Property

WRONG - Do NOT wrap properties in a schema object:
CORRECT - Put type and properties at the top level:
This is a common mistake that will cause “Invalid schema: Schema must have a ‘type’ field” errors when pushing entities.

Supported Field Types

String

Basic text field:
With format:
Available formats: date, date-time, time, email, uri, hostname, ipv4, ipv6, uuid, file, regex, richtext

String with Enum

Constrained to specific values:

Number

Integer

For whole numbers only:

Binary

For file/blob data:

Boolean

Array of Strings

Array of Objects

Field Properties

Complete Example

Here’s a complete entity definition for a Task:

Naming Conventions

  • Entity name: Use PascalCase with alphanumeric characters only (e.g., Task, TeamMember, ActivityLog)
    • Must match pattern: /^[a-zA-Z0-9]+$/
    • Valid: Task, TeamMember, Order123
    • Invalid: Team_Member, Team-Member, Team Member
  • File name: Use kebab-case matching the entity (e.g., task.jsonc, team-member.jsonc, activity-log.jsonc)
  • Field names: Use snake_case (e.g., board_id, user_email, due_date)

Relationships Between Entities

To create relationships between entities, use ID reference fields:

Row Level Security (RLS)

Row Level Security (RLS) controls which records users can access based on their identity and attributes. RLS rules are defined per entity inside the rls field of the schema. Important: If no RLS is defined, all records are accessible to all users.

RLS Operations

RLS supports five operations:

Permission Values

Each operation accepts one of the following values:
  1. true - Allow all users (including anonymous/unauthenticated)
  2. false - Block all users
  3. Condition object - Allow users matching the condition

Template Variables

Use template variables to reference the current user’s attributes:

Built-in Entity Attributes

Every entity record has these built-in attributes available for RLS rules:

Rule Types

There are two condition types you can use: 1. Entity-to-user comparison - Compare record fields to the current user’s values:
2. User condition check - Check user properties directly using user_condition:
Important notes:
  • user_condition only supports simple equality (e.g., { "role": "admin" })
  • Entity field filtering requires data. prefix: Use { "data.fieldname": value } to filter by entity field values
  • For data.* field comparisons, you can use operators: $in, $nin, $ne, $all
  • Logical operators $or, $and, $nor are available for combining conditions
⚠️ For advanced RLS patterns and examples, see rls-examples.md

RLS Examples

Owner-only access:
Department-based access:
Admin-only access:
Complete RLS configuration:

Common RLS Patterns

Public create, admin-only management (e.g., contact forms, waitlists):
Owner-only access:
Logged-in users only:

Limitations

  • user_condition is equality only: user_condition only supports exact match (e.g., { "role": "admin" }) - no operators
  • No comparison operators on user_condition: $gt, $lt, $regex, $expr, $where are NOT supported for user conditions
  • No deeply nested templates: Templates like {{user.data.profile.department}} may not work
Supported operators:
  • Logical operators: $or, $and, $nor for combining multiple conditions
  • Field operators (for data.* fields only): $in, $nin, $ne, $all
  • Entity field filtering: Use data. prefix to filter by entity field values (e.g., { "data.status": "published" } or { "data.completed": true })
⚠️ See rls-examples.md for comprehensive RLS patterns and examples

Complex Access Patterns

For complex access patterns that require multiple conditions (e.g., “owner OR admin”), you have two options:
  1. Use the Base44 Dashboard UI - The dashboard allows adding multiple rules per operation with OR logic
  2. Use separate entities - Split data into multiple entities with different access rules
  3. Use backend functions - Implement custom access logic in backend functions

Field Level Security (FLS)

Field Level Security allows you to control access to individual fields within an entity. FLS rules are defined within each field’s schema using the rls property.

FLS Operations

FLS supports the same operations as entity-level RLS:

FLS Example

In this example, only users with the hr role can read or update the salary field. All users with access to the entity can read/update other fields.

FLS Notes

  • If no field-level RLS is defined, the field inherits the entity-level RLS rules
  • FLS rules follow the same condition format as entity-level RLS
  • Use FLS for sensitive fields like salary, SSN, or internal notes

Pushing Entities

The entities push command will push all entities that exist in the base44/entities folder.
For more details on the push command, see entities-push.md.