Getting started

Markdown

Packagist & create-project

Operators install externa-core with Composer — no git clone required. Contributors still clone the GitHub repo.

Happy path (operators)

composer create-project qiick/externa-core my-externa
cd my-externa
nvm use   # Node 24 pinned in .nvmrc
php artisan externa:install
StepWhat runs
composer create-projectInstalls deps; post-root-package-install copies .env.example → .env if missing; post-create-project-cmd runs key:generate and prints Next step: php artisan externa:install
php artisan externa:installInteractive wizard: APP_NAME, APP_URL, database, minimal (no Redis) vs full stack, optional seed / LOCAL_AI_URL; keeps or generates APP_KEY, migrate, storage:link, npm build. Re-run with --force when intentional (#249)

post-create-project-cmd does not touch SQLite, run migrate, seed, or assume Redis/Horizon (#93). Create-project must succeed even when no database is reachable yet.

Install only — not the update channel

create-project copies the app once. After you push that tree to your git remote, Packagist will not deliver newer Externa releases into it. Stay current with git tags / upstream merge (or opt-in externa:upgrade --sync-upstream=vX.Y.Z, or Docker image pull), then php artisan externa:upgrade for migrate / permissions / cache — Upgrade.

Flag / stabilityWhen
Stable (omit constraint, or ^1.0 / 1.0.0)GA and later
@beta / @RCPre-1.0 tags only (1.0.0-beta.*) — keep for historical notes
composer create-project … --stability=betaAlternative when intentionally pulling a beta tag

Package: packagist.org/packages/qiick/externa-core. Full wizard details: Installation — externa:install.

Docker remains a parallel path: Installation — Docker · Deploy with Docker. Prefer one local path per checkout (Herd or Compose).

CI / non-interactive (not the human path)

Automation and contributor bootstrap that already has a working DB use:

composer setup

That runs composer install → copy .env if missing → key:generate → migrate --force → npm install → npm run build. Still run db:seed / storage:link when needed. Do not document composer setup as the create-project happy path for operators.

Contributors

git clone https://github.com/qiick-io/externa-core.git
cd externa-core
composer setup   # or: php artisan externa:install for a guided first run

Use clone when you need to open PRs, run the full test suite against develop, or customize before upstreaming.

Packagist status

Package name: qiick/externa-core (type: project). Source: github.com/qiick-io/externa-core. Listing: packagist.org/packages/qiick/externa-core.

Published — create-project resolves from Packagist. Confirm the desired tag (stable 1.0.0 or a beta) under Versions after each release. VCS fallback only if Packagist lags:

composer create-project qiick/externa-core my-externa \
  --repository='{"type":"vcs","url":"https://github.com/qiick-io/externa-core.git"}'

Maintainer: Packagist / smoke

  1. Confirm tagged releases appear under Versions on Packagist.
  2. Smoke from a clean machine:
composer clear-cache
composer create-project qiick/externa-core:^1.0 /tmp/externa-smoke --no-interaction
cd /tmp/externa-smoke
# Must print Next step: php artisan externa:install — no migrate hard-fail
php artisan externa:install
  1. Note the Packagist URL in the GitHub Release (Releasing).

Troubleshooting (create-project)

SymptomCauseFix
Create-project aborts with Connection refused / migrate errorsOld package still runs migrate in post-create-project-cmdUpgrade to a release that keeps post-create minimal (#93); or use VCS create-project from develop / the fix tag
Project directory exists but DB emptyExpected after modern create-projectRun php artisan externa:install
Re-run of externa:installWizard asks before overwriting .env (unless --force)Decline overwrite to keep current env; or pass --force when intentional. A valid existing APP_KEY is preserved (#249)
Need scripted install (CI)Human path is interactiveUse composer setup (documented above), not create-project post-scripts