The open-source DAM for modern organizations
Website · Documentation · Docker Hub · Helm charts · Report a bug
Phrasea is an open-source Digital Asset Management (DAM) platform for organizations that need control over their digital assets. It offers fine-grained permissions for users and groups, integrations with external tools and AI providers, and runs as SaaS, on-premise or in hybrid mode. Phrasea is developed by Alchemy as the successor of Phraseanet.
- Workspaces, nested collections, stories and baskets, with access control on workspaces, collections and assets.
- Metadata read from the source files on ingest, configurable attributes, single and batch editing, import templates.
- Renditions defined per workspace, file versions, file analyzers, and workflows run on ingest.
- Collaboration: sharing links (permanent or time-limited), visual annotations, discussions with mentions, notifications.
- Search backed by Elasticsearch: full text, facets, sorting, suggestions, saved searches.
- Conditions written in AQL, the Asset Query Language, shared by the API, saved searches and the condition builder.
- Results laid out on a map by geo point attributes (map).
- Publications of assets on the web, with download, gallery and lightbox layouts.
- Protection by password or authentication, terms of use, direct URLs and slugs.
- Publications synchronized from Databox baskets.
- Upload by file selector, drag and drop, clipboard or URL, with multipart upload of large files.
- Targets per user group, each with its metadata form described in JSON Schema (form configuration).
- Delivery of the uploaded batches to Databox, to Phraseanet (push or pull mode) or to a third-party endpoint.
- A single entry point listing the Phrasea services available to the user.
Databox integrations run in workflows or from user actions:
- AWS Rekognition, AWS Transcribe, AWS Translate
- Happyscribe (transcription and subtitles)
- Remove.bg (background removal)
- Toast UI Photo Editor
- Phraseanet renditions synchronization
- Moderation, watermark, Blurhash, renditions, file analyzers
- Outbound webhooks
Each application is a Symfony API plus a React client. Long-running work goes through RabbitMQ to Symfony Messenger workers.
flowchart LR
browser([Browser]) --> traefik[Traefik]
subgraph clients[Web clients]
dashboard[Dashboard]
databoxClient[Databox client]
exposeClient[Expose client]
uploaderClient[Uploader client]
end
subgraph apis[Symfony APIs]
databoxApi[Databox API]
exposeApi[Expose API]
uploaderApi[Uploader API]
end
traefik --> clients
traefik --> apis
traefik --> keycloak[Keycloak]
traefik --> sockudo[Sockudo WebSocket]
apis -- auth --> keycloak
apis --> pg[(PostgreSQL)]
apis --> redis[(Redis)]
apis --> s3[(MinIO / S3)]
apis --> rabbitmq[[RabbitMQ]]
apis --> report[Report API]
databoxApi --> es[(Elasticsearch)]
databoxApi --> sockudo
rabbitmq --> workers[Messenger workers]
workers --> pg
workers --> s3
report --> pg
keycloak --> pg
indexer[Databox indexer] -- reads sources --> s3
indexer -- creates assets --> databoxApi
A detailed diagram is available in
doc/tech/Deployment/technical-architecture.svg.
This starts the whole stack locally with Docker Compose, on the default domain phrasea.local.
Prerequisites:
- Linux with Docker 28.5.2+ and Docker Compose 2.40.3+
- About 6 CPU cores and 16 GB of RAM (indicative, see prerequisites)
- mkcert for local HTTPS certificates
- Ports 80 and 443 free (see Changing ports)
Clone the repository:
git clone https://github.com/alchemy-fr/phrasea.git
cd phraseaChange every default password or secret of .env (their values start with __CHANGE_ME_), by
overriding them in a .env.local file at the root of the project. Then define the dc function
in your ~/.bashrc or ~/.zshrc, so that Docker Compose loads .env.local:
function dc() {
if [ -f .env.local ]; then
docker compose --env-file=.env.local --env-file=.env --env-file=.env.local "$@"
else
docker compose "$@"
fi
}Create the local certificate authority (once per machine) and the certificate of *.phrasea.local:
mkcert -install
bin/dev/make-cert.shAdd the local domains to /etc/hosts:
sudo bin/dev/append-etc-hosts.shSet up the databases and the initial configuration:
bin/setup.shStart the stack:
dc up -dThen open:
| Application | URL |
|---|---|
| Dashboard | https://dashboard.phrasea.local |
| Databox | https://databox.phrasea.local |
| Expose | https://expose.phrasea.local |
| Uploader | https://uploader.phrasea.local |
| Keycloak | https://keycloak.phrasea.local |
Sign in with the user phrasea-admin and the password set in DEFAULT_ADMIN_PASSWORD.
The images are pulled from Docker Hub; run bin/build.sh first to build them from the sources.
See the setup guide (Let's Encrypt, periodic tasks, fixtures, logs) and the
development setup for the rest.
- Docker Compose: follow the setup guide.
- Kubernetes: use the Helm charts.
- Images: published on Docker Hub as
alchemyfr/ps-*(ps-databox-api-php,ps-databox-client,ps-expose-api-php,ps-uploader-api-php,ps-dashboard,ps-keycloak,ps-configurator,ps-report-api, …).
Infrastructure requirements, backups and operating tasks are described in
doc/tech/Deployment/.
The documentation is published at docs.phrasea.com, built from the
doc/ folder.
| Topic | Where |
|---|---|
| User guide | doc/user/ |
| Setup | doc/tech/01_setup.md |
| Development | doc/tech/02_dev.md |
| Configuration | doc/tech/Configuration/ |
| Authentication | doc/tech/Authentication/ |
| Deployment | doc/tech/Deployment/ |
| Tests and CI | doc/tech/Development/ci.md |
databox/ core DAM: api/ (Symfony), client/ (Next.js), indexer/ (Node.js)
expose/ publication: api/ (Symfony), client/ (React + Vite)
uploader/ ingestion: api/ (Symfony), client/ (React + Vite)
dashboard/ client/ only: the shell that ties the applications together
configurator/ Symfony application generating the per-tenant configuration
report/ reporting service
lib/php/ shared Symfony bundles (auth, storage, Elasticsearch, workflow, …)
lib/js/ shared React/TypeScript packages, published as @alchemy/*
bin/ setup, build, migration and test scripts
infra/ Docker images, Traefik and local stack configuration
doc/ user and technical documentation (source of docs.phrasea.com)
- Back end: PHP 8.5, Symfony 8.1, API Platform 5, Doctrine ORM 3, Symfony Messenger
- Front end: React and TypeScript; Next.js (App Router) for Databox, Vite for the other clients; pnpm workspaces and Turbo
- Services: PostgreSQL, Elasticsearch, RabbitMQ, Redis, MinIO / S3, Keycloak, Traefik
- Runtime: Docker Compose, or Kubernetes with Helm
Contributions are welcome: bug reports, documentation, features and fixes. Please read the contributing guide and the code of conduct.
Please do not report vulnerabilities in public issues; see the security policy.
Upgrade notes are in UPGRADE-5.md and UPGRADE-3.0.md;
changes of each version are listed on the releases page.
MIT © Alchemy. See LICENSE.