Two editions, one product
Toutadmin exists in two copies: one runs on Node.js, the other on PHP. They are not two products, nor a cut-down version and a full one. They are the same 51 spaces, the same 142-table schema, the same 16 languages, the same screens. This page says what really separates them — and it is not much.
Why two#
A business product has to be installable where the business already is. Some companies
have a server, a systemd and an administrator; others have shared hosting
for four euros a month and an FTP account. The Node edition addresses the first, the PHP
edition the second. Turning the second away would have meant turning away half the
companies that need a management tool most.
What is strictly identical#
| Item | Node | PHP |
|---|---|---|
| Business spaces | 51 | 51 |
| Database tables | 142 | 142 |
| Columns | 1311 | 1311 |
| Interface languages | 16 | 16 |
| Translation keys | 2765 | 2792 |
| Optional modules | 7 | 7 |
| Webhook events | 8 | 8 |
| API resources | 9 | 9 |
Because the schema is the same, a database moves from one edition to the other
with no conversion: stop one, copy app.sqlite and the file folders,
start the other. Passwords keep working — both editions read the same hash format. That
is the most honest test of parity there is, and it passes.
What differs#
The shape of a few addresses#
531 routes on the Node side, 513 on the PHP side. The gap is not a gap in features: these are the same functions written more compactly.
-
The API. Node declares its nine resources one by one
(
/api/v1/collaborateurs,/api/v1/services…); PHP serves them under one parameterised route. All nine answer, the root announces all nine, and a test calls them one by one to prove it. - Installation. Node guides you through five steps, PHP fits on one page and one submission. The same five pieces of information are asked for: language, prerequisites, company, annual leave days, administrator account.
-
Cross-cutting rights. Node has one route per right, PHP a single
parameterised route
/admin/droits/{flag}.
These twenty-eight differences of shape are not asserted from memory: the file
tests/test_parity.php exercises every one of them, one at a time.
The periodic sweep#
Node carries its own scheduler: the server runs permanently, so it wakes itself up. PHP
only lives during a request: the same eight operations go through
tools/cron.php, called by the hosting provider's cron. Same business code,
same effect, different trigger.
Dates#
Node writes its dates with Intl, built into V8. PHP does the same when the
intl extension is present — same ICU engine, identical results down to the
character. When it is missing, day and month names come from the translation
dictionaries: the date stays correct and translated, but the order of its parts may
differ in a few languages.
What does not differ, though you would expect it to#
| Subject | In both editions |
|---|---|
| QR codes (two-factor) | Encoder written by hand on the PHP side, validated byte for byte against the library used on the Node side, across sixteen text lengths. |
| Backup archives | tar.gz written without any dependency on both sides, same content, same SHA-256 hashes. |
| IMAP accounting mailbox | IMAP client written inside the product on both sides. |
| PDF, CSV, import | Written inside the product, same files out. |
| Audit log | Identical hash chaining: one altered row breaks the chain, on both sides. |
| HTTP security policy | Same headers, same nonce-based CSP, same absence of any JavaScript you cannot do without. |
Which to choose#
| Your situation | The edition |
|---|---|
| Shared hosting, FTP access, no command line | PHP — exactly the case it was built for |
Your own server, systemd, an administrator | Node |
| You already know how to administer one of them | That one. Parity makes the choice reversible. |
| Many people at once | Node — one permanent process, the database already open |
| You cannot decide | PHP — fewer moving parts to look after, and moving to Node later is still just copying files |
How parity is kept#
It is not an intention, it is a verification. On every change, four comparisons are run:
- The routes — extracted from both sides and compared; any gap must be a documented difference.
- The functions — the names exported by each module, compared module by module.
- The schema — tables and columns read from both databases and compared.
- The screens — both editions started side by side and walked through by a real browser, page by page, comparing response code and structure.
These four passes have found real defects — including two that affected both editions. That is what makes them worth running: a parity you do not measure is a parity you have lost without noticing.
On top of that come the test suites: 802 cases on the Node side, 572 on the PHP side, 1374 in all.
Install the Node edition
Service, reverse proxy, TLS, backups, upgrades.
Install the PHP edition
Shared hosting, permissions, cron, TLS.
Toutadmin documentation — built on 2026-09-13. A standalone site, independent of the software.