Getting Started
From zero to a running Waaseyaa application with content you can query.
Prerequisites
- PHP 8.4+ with extensions:
pdo_sqlite,mbstring,json,openssl - Composer 2.x (getcomposer.org)
- SQLite 3 (the default database)
Create a New Project
composer create-project waaseyaa/waaseyaa my-site --stability=dev
cd my-site
The --stability=dev flag is required during the pre-release phase. It goes away at v1.0.
waaseyaa/waaseyaa is the published project skeleton package. The framework source itself lives in the separate waaseyaa/framework monorepo.
That scaffolds a full Waaseyaa application from the skeleton. Your project now has config files, the Composer-installed CLI at vendor/bin/waaseyaa, templates, and directory stubs for entities, controllers, and service providers.
Initialize the Database
php vendor/bin/waaseyaa db:init
This creates a SQLite database at storage/waaseyaa.sqlite and runs all pending migrations. The skeleton ships with entity types for nodes, taxonomy terms, media, menus, and users. All of their tables are created here.
Start the Dev Server
php vendor/bin/waaseyaa serve
Open http://127.0.0.1:8080 in your browser. You should see the Waaseyaa welcome page with links to the admin, API, and documentation.
Explore Entity Types
Open a second terminal. The skeleton ships with 11 entity types out of the box:
php vendor/bin/waaseyaa entity-type:list
You'll see node, taxonomy_term, media, menu, user, and others. These are the content building blocks that come with the framework packages.
Create Your First Content
php vendor/bin/waaseyaa entity:create node
The CLI walks you through setting field values. Once created, verify it exists:
php vendor/bin/waaseyaa entity:list node
Your node is stored in SQLite. You can also view it through the JSON:API:
curl -s http://localhost:8080/api/node | jq
That returns a spec-compliant JSON:API response. Filtering, sorting, pagination, and relationship includes all work out of the box. Note that the default access control is deny-unless-granted, so anonymous requests will only see entities that have been explicitly made public.
Project Structure
my-site/
├── vendor/
│ └── bin/
│ └── waaseyaa # CLI (Composer bin from waaseyaa/cli)
├── config/
│ ├── waaseyaa.php # Framework configuration
│ ├── entity-types.php # Custom entity type registration
│ └── services.php # Service overrides
├── public/
│ └── index.php # Front controller
├── src/
│ ├── Access/ # Authorization policies
│ ├── Controller/ # HTTP controllers
│ ├── Entity/ # Your entity classes
│ ├── Provider/ # Service providers (DI, routing)
│ ├── Domain/ # Domain logic by bounded context
│ └── Seed/ # Seeders for dev/local bootstrap
├── templates/ # Twig templates
└── storage/
└── waaseyaa.sqlite # SQLite database (after db:init)
Configuration lives in config/. Your application code goes under src/. The front controller at public/index.php boots the HTTP kernel. Run CLI commands with php vendor/bin/waaseyaa from the project root (same contract as Laravel’s artisan / Symfony’s bin/console).
What's Next
You have a running application with built-in entity types and a JSON:API. From here:
- Build a custom entity type with typed fields, a controller, and a Twig template
- Understand core concepts: entities, fields, service providers, and the kernel lifecycle
- Explore the entity package for the full entity/field API reference
- Set up access control with the deny-unless-granted permission model
For the story behind why Waaseyaa exists, read the blog series.