Installation
Set up a new Waaseyaa project with Composer
This guide walks you through creating a new Waaseyaa project from the official skeleton.
Prerequisites
You need:
- PHP 8.4+ with extensions:
pdo_sqlite,mbstring,json,openssl - Composer 2.x (getcomposer.org)
- SQLite 3 (the default database)
Verify your PHP version:
php -v
# PHP 8.4.x or higher required
This confirms PHP is installed and meets the minimum version requirement.
Create a New Project
Use Composer to create a project from the Waaseyaa skeleton:
composer create-project waaseyaa/waaseyaa my-site --stability=dev
cd my-site
Use any directory name in place of my-site (the Getting Started page and the Todo tutorial use my-site for consistency).
waaseyaa/waaseyaa is the published project skeleton package. The framework source itself lives in the separate waaseyaa/framework monorepo.
This installs the skeleton with all core packages: foundation, entity, field, routing, access control, node content types, taxonomy, media, and the CLI.
Initialize the Database
Create the SQLite database and run all pending migrations:
php vendor/bin/waaseyaa db:init
This creates storage/waaseyaa.sqlite and initializes the framework tables and default entity storage tables.
Project Directory Structure
After installation, your project looks similar to this (trimmed for readability):
my-site/
├── CLAUDE.md
├── Dockerfile
├── README.md
├── bin/
│ ├── dev.sh # Local dev helper used by `composer run dev`
│ ├── post-create-setup.php # One-time setup run by Composer after create-project
│ └── maintenance/ # Contributor/release helper scripts
├── composer.json
├── composer.lock
├── config/
│ ├── active # Active config snapshots
│ ├── waaseyaa.php # Framework configuration
│ ├── entity-types.php # Custom entity type definitions
│ ├── services.php # Service overrides
│ └── sync/ # Configuration sync directory
├── docs/
│ └── local-dev.md
├── files/ # Uploaded file storage
├── phpunit.xml.dist
├── public/
│ └── index.php # Web entry point (HTTP kernel)
├── src/
│ ├── Access/ # Authorization policies
│ ├── Controller/ # HTTP controllers
│ ├── Domain/ # Domain logic by bounded context
│ ├── Entity/ # Custom entity classes
│ ├── Ingestion/ # Inbound data pipelines
│ ├── Provider/ # Service providers
│ ├── Search/ # Search providers and indexing
│ ├── Seed/ # Dev/local data seeders
│ └── Support/ # Cross-cutting utilities
├── storage/ # Application storage (SQLite DB, caches)
│ ├── framework/
│ └── waaseyaa.sqlite # SQLite database (after db:init)
├── templates/ # Twig templates for SSR
│ ├── home.html.twig
│ ├── page.html.twig
│ └── 404.html.twig
├── tests/
│ ├── Integration/
│ └── Unit/
└── vendor/
├── bin/
│ └── waaseyaa # Primary CLI binary
└── waaseyaa/
Use php vendor/bin/waaseyaa for all CLI commands. The generated bin/ directory is for project helpers; it is not the framework CLI entrypoint.
bin/dev.sh and bin/post-create-setup.php are day-to-day helpers. bin/maintenance/ is mainly for contributor/release checks and can be ignored while learning.
Key Directories
src/Provider/- Your service providers register routes, entity types, bindings, and middlewaresrc/Entity/- Custom entity classes extendingContentEntityBaseorConfigEntityBasesrc/Controller/- Thin HTTP controllers that orchestrate domain logicconfig/- Framework and application configuration filestemplates/- Twig templates rendered by the SSR packagevendor/bin/waaseyaa- The Waaseyaa CLI binary (run from project root)
Configuration
The main configuration file is config/waaseyaa.php:
<?php
return [
// SQLite database path (defaults to {projectRoot}/storage/waaseyaa.sqlite)
'database' => null,
// Config sync directory
'config_dir' => getenv('WAASEYAA_CONFIG_DIR') ?: __DIR__ . '/sync',
// File storage root
'files_dir' => getenv('WAASEYAA_FILES_DIR') ?: __DIR__ . '/../storage/files',
// CORS origins for the admin SPA
'cors_origins' => ['http://localhost:3000'],
// SSR theme and cache settings
'ssr' => [
'theme' => getenv('WAASEYAA_SSR_THEME') ?: '',
'cache_max_age' => 300,
],
// AI embedding pipeline (optional)
'ai' => [
'embedding_provider' => getenv('WAASEYAA_EMBEDDING_PROVIDER') ?: '',
],
];
This file sets database paths, file storage locations, CORS origins, SSR theme settings, and optional AI configuration.
Environment variables let you override settings per environment without changing the config file:
| Variable | Purpose | Default |
|---|---|---|
WAASEYAA_DB |
SQLite database path | {projectRoot}/storage/waaseyaa.sqlite |
WAASEYAA_CONFIG_DIR |
Config sync directory | config/sync/ |
WAASEYAA_FILES_DIR |
Uploaded file storage | storage/files/ |
WAASEYAA_JWT_SECRET |
JWT signing secret for API auth | (empty) |
WAASEYAA_SSR_THEME |
Active SSR theme package | (empty) |
Run the Development Server
Start the built-in development server:
php vendor/bin/waaseyaa serve
This launches a PHP development server on port 8080. Visit http://localhost:8080 to see the default welcome page.
Verify the Installation
Check the Welcome Page
Open http://localhost:8080 in your browser. You should see the Waaseyaa welcome page with links to the admin SPA, API endpoint, and CLI commands.
Check the API
The JSON:API endpoint is available at /api:
curl http://localhost:8080/api/note \
-H "Content-Type: application/vnd.api+json"
This returns a JSON:API response listing notes. The response will be empty until you create content.
Create Entity Database Tables
Use the CLI to set up storage and verify the installation:
# List available CLI commands
php vendor/bin/waaseyaa list
# Create an entity interactively
php vendor/bin/waaseyaa entity:create node
# Export configuration
php vendor/bin/waaseyaa config:export
These commands confirm that the kernel boots, entity types are registered, and the config system works.
Create a Note via the API
Waaseyaa ships with a built-in core.note content type that is always available:
curl -X POST http://localhost:8080/api/note \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "note",
"attributes": {
"title": "Hello, Waaseyaa",
"body": "My first note."
}
}
}'
This creates a note entity through the JSON:API endpoint and returns the created resource.
Next Steps
Your Waaseyaa project is ready. Continue with:
- Build a Todo App - Create a working app with entities, routes, and CRUD in 20 minutes
- Core Concepts - Understand the entity model, service providers, and kernel lifecycle