# Project types
This is what the engine can run. You point it at a repository. It looks at the files and starts the project the way that kind of project expects.
To check one repository without putting it online, see How detection works. For the files that have to sit at the top of the repository, see What your repository needs.
# Before you start
Three things apply to every project.
The version of the language comes from your own files, not from a setting in the engine. You write it in the project (composer.json, package.json, go.mod, and similar).
The file that marks the project has to sit at the top of the repository, not in a subfolder. If it is buried, the engine will misread the project. A few ready-made apps already know their own layout and are handled for you.
The engine tells the app which address to use. If the app is written to use only localhost, or a fixed port of its own, it will build but nobody will be able to open it.
# Websites
# A home page named index.html
A folder of files with index.html (or index.htm) at the top is a static site. The engine shows those files as they are.
# Pages without an index.html
A hand-written site of pages such as home.html and about.html, with no index.html, is still a website. Every file has to be something a browser can open: a page, stylesheet, script, image, font, or media file. One package.json or composer.json anywhere in the repository, and it is no longer treated this way.
# WordPress and ready-made apps
WordPress, Matomo, phpBB, Magento, Passbolt, OpenCart, osTicket, Flarum, SuiteCRM, Chamilo, MantisBT, Easy!Appointments, Adminer, and phpMyAdmin are recognised as PHP apps and started for you.
How to finish the first WordPress setup and look after a site that is already on this engine: WordPress and known apps.
# JavaScript apps
These are projects with a package.json at the top of the repository. Commit the lockfile (package-lock.json, yarn.lock, and similar). The engine uses whichever lockfile is in the project.
# Apps that stay running
Next.js, Nuxt, SvelteKit, Remix, Astro (when it runs on the server), NestJS, TanStack Start, Express, Fastify, and a plain Node app. A plain Node app also needs a start script in package.json, or a file such as index.js, server.js, or app.js.
They start from the start script when there is one.
# Apps that build into files
Vite, Angular, Create React App, Astro when it builds a static site, and Next.js when it exports static files. The engine builds the files, then shows them as a website.
# If package.json is almost empty
No known framework, no start script, and no server file: the engine tries a general build instead.
# PHP sites
Laravel and other Composer-based PHP need composer.json at the top of the repository. The PHP version comes from that file.
Plain PHP needs only its source files. It does not need Composer.
Ready-made PHP apps are covered under WordPress and ready-made apps.
# Other languages
# Python
Django needs a manage.py file (it may sit in a subfolder). Other Python projects need one of requirements.txt, pyproject.toml, Pipfile, or setup.py at the top, and no manage.py.
Django starts the way Django usually starts. Other Python projects start from main.py or app.py, or from a common Python web server if one is already in the project. Failing those, the engine runs the one command the project declares under [project.scripts] in pyproject.toml, or the one top-level .py file that ends in an if __name__ == "__main__": block. When there are several of either, name the entry point in a panelalpha.yaml.
# Ruby
Rails needs a Gemfile and config/application.rb. Plain Ruby needs a Gemfile plus either a config.ru file or a web: line in a Procfile.
A Gemfile on its own, with none of those, goes to a general build.
# Go, Rust, Java, and .NET
- Go: a
go.modat the top. The engine builds the program and runs it. - Rust: a
Cargo.tomlat the top, built for production. A library with nothing to run is refused. - Java: a
pom.xmlfile, orbuild.gradle/build.gradle.kts. The packed application is run. - .NET: a
.csprojor.slnfile, which may sit one or two folders down.
# If you already pack the app in Docker
Docker Compose. A docker-compose.yml or compose.yml file is checked near the top, so it usually wins. A compose file you only use on your own computer is still picked up. Rename or remove it if you do not want that.
A Dockerfile. A Dockerfile or Containerfile. The image starts the way it was written to start. If both files exist, the Dockerfile is used.
# If the engine does not recognise it
It still tries a general build when the repository has a language file (package.json, composer.json, go.mod, requirements.txt, Gemfile, and similar) but did not match a named kind above.
Unknown means it did not recognise the project, or the project is not a website. Check that before you deploy: What your repository needs.
# Names you might see in a log
These are the short names the engine uses when you inspect a repository and in deploy logs.
| Name | What it is |
|---|---|
compose | Docker Compose |
dockerfile | A Dockerfile or Containerfile |
laravel | Laravel |
php | PHP, including WordPress, OpenCart, Magento, Matomo, and PHP without Composer |
rails | Ruby on Rails |
ruby | Ruby |
django | Django |
python | Python |
go | Go |
rust | Rust |
java | Java |
dotnet | .NET |
nextjs | Next.js, including a static export |
nuxt | Nuxt |
sveltekit | SvelteKit, including static |
remix | Remix |
astro | Astro, including when it runs on the server |
nestjs | NestJS |
tanstack-start | TanStack Start |
angular | Angular |
cra | Create React App |
vite | Vite |
express | Express |
fastify | Fastify |
node | A Node app that is not one of the frameworks above |
static | Files including an index.html. Pages with no index.html use the same serving and are labelled HTML site |
railpack | The general build, used when nothing more specific matched |
fallback | Unknown, or not a website |
# Real applications to try
These deploy real applications from the Supported board, a few from each stack. The tools and the way to follow a deploy are on Connecting with Git.
| Application | Technology | Repository | Board issue |
|---|---|---|---|
| PrestaShop | PHP | https://github.com/PrestaShop/PrestaShop | #334 |
| OpenCart | PHP, known app | https://github.com/opencart/opencart | #335 |
| Firefly III | Laravel | https://github.com/firefly-iii/firefly-iii | #8 |
| MeTube | Python | https://github.com/alexta69/metube | #191 |
| Umami | Node.js | https://github.com/umami-software/umami | #26 |
| ntfy | Go | https://github.com/binwiederhier/ntfy | #338 |
| Memos | Go | https://github.com/usememos/memos | #101 |
| Stump | Rust | https://github.com/stumpapp/stump | #730 |
| Scoold | Java | https://github.com/Erudika/scoold | #924 |
| Chatwoot | Ruby | https://github.com/chatwoot/chatwoot | #310 |
A deploy of any of them is working when all four hold:
- The inspection before the deploy names a branch and a way to run it.
- The deploy ends
successorpartial, and the deploy log records its timings. - The application's health check reads
serving: ok. A placeholder page that answers is not support. - The site's address answers 200, 301 or 302. 303, 307, 308, 401 and 403 count too when the health check says the application itself is answering, because many applications answer with a login wall.
Tools for every request below: source_inspect, project_create, task_get, deploy_log_get, app_health_check, project_get. Mode: modify.
PHP: PrestaShop
Check https://github.com/PrestaShop/PrestaShop first, then deploy it as project
tprestashop on this PanelAlpha Engine. When it is up, tell me whether it is
serving the application and which address to open.
Check: the shop's installer or front page at the address.
PHP known app: OpenCart
Deploy https://github.com/opencart/opencart as project topencart. Tell me if the
engine recognised it as a known app, and what the first page asks for.
Check: the inspection reports a known app, and the first page is the installer or the login.
Laravel: Firefly III
Deploy https://github.com/firefly-iii/firefly-iii as project tfirefly. Tell me
which PHP version it picked and why, and whether it needs a database from me.
Check: the inspection names Laravel, and the PHP version comes from composer.json. Extra tools: project_inspect. If the application needs a database that the engine does not create, the assistant says so rather than guessing: see Databases.
Python: MeTube
Deploy https://github.com/alexta69/metube as project tmetube and tell me how it
is started.
Check: the assistant names the start command from the inspection, not a guess.
Node.js: Umami
Deploy https://github.com/umami-software/umami as project tumami and tell me
what the first page shows.
Check: Umami's login page at the address.
Go: ntfy
Deploy https://github.com/binwiederhier/ntfy as project tntfy2 and tell me which
port it listens on.
Check: project_inspect lists the published port, and the assistant names it.
Go: Memos
Deploy https://github.com/usememos/memos as project tmemos. Then rebuild it and
confirm it still answers.
Extra tools: project_rebuild. Check: the second deploy completes and the application answers again.
Rust: Stump
Deploy https://github.com/stumpapp/stump as project tstump. A Rust build can be
slow: keep following the deploy and tell me which stage is taking the time.
Extra tools: deploy_log_get with offset. Check: the assistant reports a stage from the log, not a guess.
Java: Scoold
Deploy https://github.com/Erudika/scoold as project tscoold and tell me if the
build ran out of memory.
Check: a memory failure in the log is reported as a memory failure, with the limit named: Limits.
Ruby: Chatwoot
Deploy https://github.com/chatwoot/chatwoot as project tchatwoot. Tell me which
services it starts and whether the site answers.
Extra tools: container_list. Check: every service it starts is listed, and the address answers.
Clean up
Delete the projects tprestashop, topencart, tfirefly, tmetube, tumami, tntfy2,
tmemos, tstump, tscoold and tchatwoot.
Mode: full. Tools: project_delete, project_list. Check: each project is gone from the list, and its address no longer answers. Delete only the names this run created.