Accent
Overview
Accent is an open-source, developer-oriented translation and localisation management platform. It turns the translation files already in your codebase (JSON, YAML, gettext PO, Android XML, Apple .strings, XLIFF, CSV, Java properties and more) into a shared workspace where developers, translators and reviewers work from the same source of truth. Files move in and out over a sync and export API, so Accent fits into your existing build pipeline, and every key keeps a full history of who changed what and when.
This SecureAnyCloud image runs the free, open-source, BSD 3 Clause licensed Accent release on Ubuntu 24.04 on Azure, in the officially supported way: the upstream container pinned by image digest, paired with PostgreSQL 16. Both images are captured into the VM, so your instance starts in seconds with nothing to download.
Accent has no password authentication of its own, so the image does not leave it open. Accent binds to the loopback interface, PostgreSQL publishes no host port, and nginx on port 80 is the single public listener, gated by a unique web credential generated on the first boot of every VM. The Phoenix session signing key, the cookie signing salt, the machine translation vault key and the database password are also generated per instance on first boot, replacing the published upstream defaults.
Accent is a trademark of its respective owner. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by, or sponsored by Mirego or the Accent project. It ships the free, open-source BSD 3 Clause licensed software, unmodified.
What you get:
- Accent 1.30.4: the official upstream release container, pinned by image digest, with the compiled web application bundle built in
- PostgreSQL 16: the application database, on a private container network with no host port published
- nginx: the single public listener on port 80, gated by a per-instance web credential
- First-boot secret generation: session signing key, cookie signing salt, machine translation vault key, database password and web credential, all unique to each VM
- A bundled self-test: imports a translation file and reads the exact strings back out, proving the platform works end to end
- A side-by-side editor with comments and a review state for each key, conflict detection when a source string changes under an existing translation, versioned releases, linting for problems such as missing interpolation variables, and per-project collaborator roles
- A GraphQL API and a command-line client, so a project can be synchronised from continuous integration on every merge
- 24/7 SecureAnyCloud support
Prerequisites
- An Azure subscription with permission to create virtual machines
- An SSH key pair for administrative access
- A network security group (NSG) that allows inbound TCP 22 (SSH) and TCP 80 (web UI) from your own address ranges
- A VM size of
Standard_B2s(2 vCPU, 4 GB RAM) or larger
Deploy from the Azure Portal
- Open the Azure Marketplace and search for Accent on Ubuntu 24.04 LTS by SecureAnyCloud.
- Select Create, then choose your subscription, resource group and region.
- Pick a VM size of
Standard_B2sor larger. - Under Administrator account, select SSH public key and paste your public key.
- Under Inbound port rules, allow SSH (22) and HTTP (80).
- Select Review + create, then Create.
Deploy from the Azure CLI
az group create --name accent-rg --location eastusaz vm image terms accept --urn sac1647283583153:accent-ubuntu-24-04:default:latest
az vm create \
--resource-group accent-rg \
--name accent-vm \
--image sac1647283583153:accent-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard
az vm open-port --resource-group accent-rg --name accent-vm --port 80 --priority 1010Connect to your VM
ssh azureuser@<vm-ip>Confirm the services are running
Check the five units that make up the deployment: docker, accent-firstboot (generates this VM's secrets), accent (the compose stack), accent-postboot (bootstraps the administrator account) and nginx.
systemctl is-active docker accent-firstboot accent accent-postboot nginxAll five report active. The two containers should both be up:
sudo docker ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}'Confirm the network exposure
Accent is deliberately not reachable directly. Only nginx listens on a public address. Run:
ss -tln | grep -E ':(80|4000|5432) 'You will see 127.0.0.1:4000 for Accent and 0.0.0.0:80 for nginx. PostgreSQL does not appear. It publishes no host port and is reachable only from the Accent container on a private network.
Read the per-instance credentials
Every VM generates its own secrets on first boot and writes them to a file that only root can read. Print it with:
sudo cat /root/accent-credentials.txtThe file records the web credential (WEB_USER and WEB_PASSWORD), the administrator email address for signing in to Accent, and this VM's URL. Confirm that the file is locked down:
ls -l /root/accent-credentials.txtstat -c '%a %U:%G %n' /root/accent-credentials.txtUnderstand the security model
Read this step first: Accent's authentication model is unusual.
Accent has no password login of its own. Out of the box, its only ready-to-use sign-in method is a passwordless email prompt. You type any email address and you are signed in, with no secret. Every real identity provider that Accent supports (GitHub, GitLab, Google, Slack, Discord, Microsoft and generic OIDC) requires an OAuth application that only you can register, so those credentials cannot be included in a shared Marketplace image.
On a public IP address, that default would let anyone who can reach the port sign in. This image therefore puts a gate in front of Accent:
- Accent binds to
127.0.0.1:4000and is not directly reachable. - PostgreSQL publishes no host port.
- nginx on port 80 is the only public listener. It requires HTTP Basic authentication with this VM's unique
WEB_USERandWEB_PASSWORD.
As a result, you sign in twice: once at the browser credential prompt, then once with the Accent email login. Verify the gate yourself:
curl -s -o /dev/null -w 'no credential: HTTP %{http_code}\n' http://127.0.0.1/curl -s -o /dev/null -w 'wrong credential: HTTP %{http_code}\n' -u '<WEB_USER>:definitely-wrong' http://127.0.0.1/Both requests return 401. With the real credential, the request returns 200:
curl -s -o /dev/null -w 'per VM credential: HTTP %{http_code}\n' -u '<WEB_USER>:<WEB_PASSWORD>' http://127.0.0.1/The image also ships a self-test that proves the whole platform works, not just that a page loads. It signs in, creates a project and imports a translation file that it writes itself. It then reads the strings back and checks the exact values and count, and confirms that an unauthenticated import writes nothing. Run it with:
sudo /usr/local/sbin/accent-roundtrip.shOpen Accent and sign in
Browse to your VM:
<ACCENT_URL>Your browser first asks for the web credential. Enter WEB_USER and WEB_PASSWORD from Step 6. Accent's own sign-in page then appears.
Enter the ADMIN_EMAIL value from your credentials file and select Enter an email and login. Accent opens the projects list.
Create your first project
Select New project, enter a name and choose the main language of your source strings. This language becomes the project's master revision, and Accent tracks every other language you add against it.
Sync a translation file
Import files through Accent's sync endpoint. The command-line client and your continuous integration pipeline make the same call. The language parameter is required alongside document_format and file. Create a sample file:
printf '{"app.title":"Northwind Field Service","nav.jobs":"Jobs"}' > /tmp/en.jsonPush it, replacing the project ID with your own from the browser address bar:
curl -s -o /dev/null -w 'sync: HTTP %{http_code}\n' \
-u '<WEB_USER>:<WEB_PASSWORD>' \
-b /tmp/accent-session -c /tmp/accent-session \
-X POST '<ACCENT_URL>sync' \
-F 'project_id=<your-project-id>' \
-F 'document_path=en' \
-F 'document_format=simple_json' \
-F 'language=en' \
-F 'file=@/tmp/en.json;type=application/json'After the sync completes, open All strings in the project sidebar to see every key with its text and review state.
Edit and review a string
Select a key to open its editor. You can change the text, mark it as reviewed, discuss it with a collaborator in the conversation tab, and inspect every past edition.
Export a file back out
Export is the mirror of sync. Your build pipeline calls it to pull finished translations back into the codebase. The language parameter is required here too:
curl -s -u '<WEB_USER>:<WEB_PASSWORD>' -b /tmp/accent-session \
'<ACCENT_URL>export?project_id=<your-project-id>&document_path=en&document_format=simple_json&language=en&inline_render=true'Wire up real single sign-on
The web credential gate exists because Accent ships no password login. To replace the passwordless email login with a real identity provider, register an OAuth application with your provider, then add its credentials to this VM.
Accent reads credentials from the environment. Add the keys to the per-instance environment file and the matching entries to the compose file:
sudo nano /etc/accent/accent.envFor GitHub, add GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET. For a generic OIDC issuer, add OIDC_CLIENT_ID, OIDC_CLIENT_SECRET and OIDC_DISCOVERY_URI. Google, GitLab, Slack, Discord and Microsoft follow the same pattern. Then reference those variables in the accent service's environment: block:
sudo nano /etc/accent/compose.yamlRestart the stack to apply the changes:
sudo systemctl restart accentSet the callback URL at your provider to <ACCENT_URL>auth/<provider>/callback. Once your provider works, remove DUMMY_LOGIN_ENABLED from the compose file to disable the passwordless email login. If your provider is then the only way in, you can also drop the auth_basic lines from /etc/nginx/sites-available/accent.
No third-party credentials ship in this image, and no single sign-on is configured out of the box.
Manage the service
Check the service status and read the application logs:
sudo systemctl status accent --no-pagersudo docker logs accent --tail 50Restart or stop the whole stack with sudo systemctl restart accent or sudo systemctl stop accent.
Use your own domain and HTTPS
Accent is served over plain HTTP on port 80 so that it works as soon as the VM boots. For production, point a DNS name at the VM and terminate TLS in front of it.
After you add a certificate, set CANONICAL_URL in /etc/accent/accent.env to your https:// address and restart. Links in emails and authentication redirects then use your domain. Because the scheme is HTTPS, Accent also enables secure cookies automatically.
Security recommendations
- Restrict inbound port 80 to the networks that need it.
- Put TLS in front of the VM before you use it with real content, so that neither the web credential nor session cookies travel in clear text.
- Replace the passwordless email login with a real identity provider as soon as practical (Step 13).
- Set
RESTRICTED_PROJECT_CREATOR_EMAIL_DOMAINto limit who can create projects. - Keep
/root/accent-credentials.txtat mode0600and never copy it to a shared system. - Back up the
accent_pgdataDocker volume, which holds every project, translation and revision.
Support and Licensing
Accent is open-source software distributed under the BSD 3 Clause Licence (Copyright Mirego). The image also carries these components, all redistributed unmodified:
- The LanguageTool grammar engine, licensed under LGPL 2.1, which Accent bundles for its linting checks
- Hunspell and its dictionaries
- Erlang/OTP and Elixir, under Apache 2.0
- PostgreSQL 16, under the PostgreSQL Licence
- Docker Engine, under Apache 2.0
- nginx, under the BSD 2 Clause Licence
The shipped set contains no AGPL, SSPL or source-available component.
SecureAnyCloud provides 24/7 support for this image. Upstream project documentation is at github.com/mirego/accent.
Deploy on Azure
Find Accent on Ubuntu 24.04 LTS by SecureAnyCloud on the Azure Marketplace.
Deploy on Azure
Launch Accent on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Accent is an open-source, developer-oriented translation and localization management platform. Developers sync an application's translation files in and out through an API and CLI. Translators manage, review, lint and collaborate on strings in a web UI, with full version history and a review workflow. Accent is an Elixir and Phoenix GraphQL API backed by PostgreSQL, with a compiled JavaScript web frontend.
This SecureAnyCloud image runs Accent as the official upstream mirego/accent container, pinned by digest, alongside a bundled PostgreSQL. Docker Compose orchestrates both under a single systemd service on a private container network.
Security is enforced from first boot. Accent has no built-in password authentication, and upstream ships published defaults for its Phoenix secret key base, session signing salt and encryption vault key. This image never uses those defaults. Before Accent starts, the instance generates a unique value for each, plus the PostgreSQL password, the web credential and the self-signed TLS certificate.
What you get:
- Accent v1.30.4, the BSD-3-Clause licensed translation platform, shipped as the official
mirego/accentimage pinned by digest - A bundled PostgreSQL, pinned by digest and reachable only inside a private container network
- Docker Engine with Accent on the loopback interface behind nginx over TLS on port 443
- An nginx reverse proxy with a per-instance self-signed certificate and HTTP Basic authentication, with plain HTTP on port 80 redirecting to HTTPS
- A per-instance web credential, PostgreSQL password, Phoenix secret key base, session signing salt and encryption vault key generated on first boot
- A per-instance administrator bootstrapped through Accent's own login flow, with details written to a root-only file
- The Docker data root, including the pre-pulled digest-pinned images and the translation database, on a dedicated data volume at
/var/lib/docker, so your data survives OS-disk changes and can be resized independently docker.service,accent.serviceandnginx.serviceas enabled, active systemd units- 24/7 SecureAnyCloud support
Prerequisites
You need an AWS account, an EC2 key pair in the target region, and a VPC with a public subnet. m5.large (2 vCPU / 8 GiB RAM) is the recommended instance type.
Configure the security group to allow inbound 22/tcp from your management network for SSH and 443/tcp for the web UI.
Step 1 - Launch the AMI
Subscribe to the listing in AWS Marketplace, then launch an instance from the AMI into your VPC with the security group described above. Choose the m5.large instance type and attach your EC2 key pair.
The pre-pulled container images are kept on the dedicated data volume, so the Accent stack comes up within a few minutes of first boot with no image re-pull while it runs its database migrations and language seeds.
Step 2 - Connect to your instance
Connect over SSH as the default login user for the operating system variant you launched. The login user differs per OS.
OS variant: Ubuntu 24.04. SSH login user: ubuntu. Example: ssh -i your-key.pem ubuntu@<instance-public-ip>
ssh -i your-key.pem ubuntu@<public-ip>Step 3 - Read your unique credentials
On first boot, the instance generates a web credential and bootstraps an administrator, both unique to that instance. It writes them, with the resolved web URL, to a root-only file. Read the file with sudo:
sudo cat /root/accent-credentials.txtThe file shows the web URL, the HTTP Basic credential (WEB_USER / WEB_PASSWORD) and the Accent administrator email (ADMIN_EMAIL) for this instance. The image contains no default or shared login. Every secret is unique to the instance.
Step 4 - Verify the security model from the command line
Before you open a browser, confirm that the front door is closed to anyone without the per-instance credential. The nginx TLS proxy on port 443 uses a self-signed certificate, so pass curl -k to accept it. An unauthenticated request is refused with 401:
curl -sk -o /dev/null -w 'no credential -> %{http_code}\n' https://127.0.0.1/The same request with the per-instance web credential returns 200:
curl -sk -o /dev/null -w 'with credential -> %{http_code}\n' -u '<WEB_USER>:<WEB_PASSWORD>' https://127.0.0.1/Confirm that plain HTTP redirects to HTTPS:
curl -sk -o /dev/null -w 'http :80 -> %{http_code}\n' http://127.0.0.1/Accent listens only on the loopback interface, and the bundled PostgreSQL is never published to a host port. Confirm that neither is exposed to the network:
ss -tln | grep -qE '0\.0\.0\.0:4000|\[::\]:4000' && echo 'WARNING: Accent exposed beyond loopback' || echo 'Accent is loopback-only (127.0.0.1:4000)'
ss -tln | grep -q ':5432 ' && echo 'WARNING: PostgreSQL exposed on a host port' || echo 'PostgreSQL is not exposed on any host port'Confirm that the services are active and that the translation database lives on the dedicated data volume:
systemctl is-active docker.service accent.service nginx.service findmnt -no SOURCE,TARGET,FSTYPE /var/lib/dockerStep 5 - Sign in to the web UI over TLS
Open the web URL from your credentials file in a browser:
https://<instance-public-ip>/The instance uses a per-instance self-signed TLS certificate. Accept the browser certificate warning, or front the instance with your own domain and certificate. By design, you then sign in twice:
- Answer the browser HTTP Basic prompt with
WEB_USERandWEB_PASSWORDfrom your credentials file. This per-instance front-door gate keeps a public instance from being an open door. - On the Accent sign-in page, choose the email login and enter the
ADMIN_EMAILfrom your credentials file.
After you sign in, Accent opens the projects dashboard, where you create and open projects.
Open a project to reach the string editor. It lists every translation key and its text with its review status, ready to edit, review and lint.
Each project shows overall translation progress and per-language review status, with sync, add-translations and export actions and a live activity feed. The activity view records every file sync, new string, conflict and review. Filter it by collaborator, version and activity type to follow the localization history.
Step 6 - Sync a translation file through the API
Developers keep translation files in step with the codebase through Accent's file sync and export endpoints, which sit behind the same TLS front door. Create a project in the UI and note its master language. Then push a simple_json file of source strings. The example below authenticates with the per-instance web credential and imports a small file:
cat > /tmp/en.json <<'JSON' { "app.title": "My Application", "button.save": "Save changes", "auth.sign_in": "Sign in" } JSON curl -sk -u '<WEB_USER>:<WEB_PASSWORD>' -b /tmp/accent.jar -c /tmp/accent.jar \
"https://127.0.0.1/auth/dummy/callback?email=<ADMIN_EMAIL>" -o /dev/null echo "Signed in as <ADMIN_EMAIL>; create a project in the UI, then POST a file to https://<instance-public-ip>/sync with project_id, document_path, document_format=simple_json and language."At release time, pull the reviewed files back out through the /export endpoint. To script this from your build pipeline, point the Accent CLI at https://<instance-public-ip>/ with the same per-instance web credential.
Step 7 - Wire up your own single sign-on (optional)
Accent has no password authentication of its own. Its zero-configuration login is a passwordless provider, which is why this image keeps it behind the per-instance HTTP Basic gate.
To move to real single sign-on, register an OAuth or OIDC application with your own provider (GitHub, GitLab, Google, Slack, Discord, Microsoft or any generic OIDC issuer). Add its client ID and secret to /etc/accent/accent.env and the matching environment keys to /etc/accent/compose.yaml, then restart Accent:
sudo systemctl restart accent.serviceAfter you verify your single sign-on, you can remove the basic-auth gate from the nginx site at /etc/nginx/sites-available/accent and reload nginx. No third-party credentials ship in this image, and no single sign-on is configured out of the box.
Step 8 - Data volume and backups
The Docker data root at /var/lib/docker is a dedicated EBS volume. The pre-pulled images and the PostgreSQL translation database are therefore independent of the OS disk. Back the volume up with EBS snapshots or AWS Backup, and grow it as your string catalog expands.
The mount is defined in /etc/fstab by filesystem UUID, so it survives reboots and re-attachment.
Security notes
- No default or shared credentials. The Phoenix secret key base, session signing salt and encryption vault key that upstream ships as published defaults are never used. Each instance generates a unique value for each on first boot.
- Per-instance secrets. The web credential, the PostgreSQL password and the self-signed TLS certificate are generated per instance on first boot. They are written only to the root-only
/root/accent-credentials.txt. - Closed front door. nginx enforces a per-instance HTTP Basic credential over TLS, so a scanner or passer-by cannot reach or self-register with the passwordless provider.
- Network isolation. Accent binds only to the loopback interface, PostgreSQL is never published to a host port, and only the nginx TLS reverse proxy is exposed.
- Fresh database on first boot. The image carries no database, no user accounts and no secrets. Every instance initializes a clean database with freshly generated secrets.
Troubleshooting
- The stack is still starting. On first boot, Accent runs its database migrations and language seeds, which can take a few minutes. Check progress with
systemctl status accent.serviceandsudo docker compose -f /etc/accent/compose.yaml logs --tail 100. - Browser certificate warning. The instance uses a self-signed certificate. Accept it in the browser, or terminate TLS at your own load balancer or reverse proxy with your own certificate.
- Forgot the credential. Read the file again with
sudo cat /root/accent-credentials.txt.
Support
SecureAnyCloud provides 24/7 technical support for this product by email and live chat at sales@secureanycloud.com. We help with deployment, wiring up your own OAuth or OIDC single sign-on and retiring the basic-auth gate, reverse-proxy termination with your own domain and certificate, and backup planning for your translation database.
Accent is open-source software licensed under the BSD-3-Clause license. This image is not affiliated with, endorsed by, or sponsored by Mirego or the Accent project. The Accent name is used only to identify the open-source software shipped in this image.
Deploy on AWS
Launch Accent with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com