Files
zftpd/docs/architecture.md
seregonwar b8a230e348 web: browser interface updates and documentation
Bring the file manager, transfers, settings and games views in line with the
split HTTP APIs (dump jobs, copy/extract progress, DNS filter and system
status), refresh the styling and document the API, pkg install flow and
architecture, together with the repository issue and pull request templates.
2026-09-30 17:51:29 +02:00

2.4 KiB

Architecture and repository layout

zftpd is organized by responsibility instead of by filename prefix. A module owns its implementation and headers, while generated code is kept out of the source tree.

src/
├── app/          process entry point and composition
├── ftp/          FTP protocol, sessions, commands and data path
├── http/         HTTP server, REST API, parsing and CSRF
├── transfer/     remote-to-local transfer manager and protocol backends
├── archive/      ZIP, PKG and exFAT/container readers
├── runtime/      event-loop implementations
└── platform/     platform abstraction layer
    └── ps5/      PS5-only networking/filter code

include/
├── ftp/
├── http/
├── transfer/
├── archive/
├── runtime/
└── platform/
    └── ps5/

Dependency direction

The intended dependency direction is deliberately one-way:

app
├── ftp ───────────────> platform
└── http
    ├── transfer ──────> external protocol libraries / POSIX
    ├── archive
    └── platform

runtime ───────────────> platform / operating-system event APIs

Lower-level modules must not import app. platform must not depend on FTP or HTTP policy. Protocol-specific remote transfer code belongs in transfer/backends, not in REST handlers or the PAL.

Generated code

Generated files are build artifacts. In particular, the embedded web UI and PS5 CA bundle are generated under build/<target>/<variant>/generated/ and are never committed under src/.

This keeps source diffs reviewable and prevents a small web change from creating tens of thousands of lines of generated C changes.

External dependencies

Do not reimplement mature network protocols inside zftpd. HTTP/HTTPS/FTP/FTPS use libcurl and NFS uses libnfs. PS4 and PS5 consume the PacBrew ports. See dependencies.md for pinned versions and build details.

Adding a feature

Choose the module by ownership, not by caller. A new FTP command belongs in ftp/; an HTTP route belongs in http/; a new remote source protocol belongs in transfer/; a console syscall or compatibility layer belongs in platform/. If multiple modules need a facility, place it in the lowest layer that can provide it without importing a higher-level policy module.