The approved design for qbit-file-gateway: docs/DESIGN.md.
Stacked on #1 (scaffold). Until #1 merges this diff also shows the scaffold. After it merges, the diff is only docs/DESIGN.md.
Highlights:
A virtual SFTP tree generated from metadata and filtered by the user's permissions:
apps and tables;
upload/<profile>/, views/, reports/, results/ and archive/;
endpoints (aliases) with an ENDPOINTS_ONLY chroot.
Data only through /qqq/v1 with UiApiInvoker on channel sftp, as the signed-in user. Masking, permissions and audits apply as in the UI.
Core additions, in a separate qqq PR:
in-process sessions for the invoker, accepted only on loopback with a JVM-held token;
streamed binary responses;
multipart uploads.
qbit-authentik:customizeAutomatedSessionForUser.
The consumer and outbox API (com.kingsrook.qbits.filegateway.api), agreed with the qbit-edi agent. Bulk load is the default consumer.
SSH-key-only SFTP (Apache MINA SSHD) with:
lockouts and CIDR allowlists;
expiry and per-account limits;
a scan hook and optional PGP.
Tables file_gateway_account, _ssh_key, _alias, _upload_job, _outbox_file, _transfer_log and _connection_log, plus the app home.
A k8s example with one SFTP port, no passive range, and a stateless, read-only root filesystem.
Acceptance tests, including the no-disk filesystem guard.
Owner decisions recorded:
2026-10-12: all recommendations accepted.
2026-10-13: separate deployment; /qqq/v1 only; SSH keys; SFTP only in v1 (FTPS documented as future); no files or filesystem, just the database and S3; the consumer and outbox API.
Open for the owner: the LoadBalancer IP in 10.100.22.60–.69.
The approved design for qbit-file-gateway: `docs/DESIGN.md`.
**Stacked on #1 (scaffold).** Until #1 merges this diff also shows the scaffold. After it merges, the diff is only `docs/DESIGN.md`.
Highlights:
- A virtual SFTP tree generated from metadata and filtered by the user's permissions:
- apps and tables;
- `upload/<profile>/`, `views/`, `reports/`, `results/` and `archive/`;
- endpoints (aliases) with an `ENDPOINTS_ONLY` chroot.
- **Data only through `/qqq/v1`** with `UiApiInvoker` on channel `sftp`, as the signed-in user. Masking, permissions and audits apply as in the UI.
- **Core additions, in a separate qqq PR:**
- in-process sessions for the invoker, accepted only on loopback with a JVM-held token;
- streamed binary responses;
- multipart uploads.
- **qbit-authentik:** `customizeAutomatedSessionForUser`.
- **The consumer and outbox API** (`com.kingsrook.qbits.filegateway.api`), agreed with the qbit-edi agent. Bulk load is the default consumer.
- **SSH-key-only SFTP** (Apache MINA SSHD) with:
- lockouts and CIDR allowlists;
- expiry and per-account limits;
- a scan hook and optional PGP.
- Tables `file_gateway_account`, `_ssh_key`, `_alias`, `_upload_job`, `_outbox_file`, `_transfer_log` and `_connection_log`, plus the app home.
- A k8s example with one SFTP port, no passive range, and a stateless, read-only root filesystem.
- Acceptance tests, including the no-disk filesystem guard.
Owner decisions recorded:
- 2026-10-12: all recommendations accepted.
- 2026-10-13: separate deployment; `/qqq/v1` only; SSH keys; **SFTP only in v1** (FTPS documented as future); **no files or filesystem, just the database and S3**; the consumer and outbox API.
Open for the owner: the LoadBalancer IP in 10.100.22.60–.69.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The approved design for qbit-file-gateway:
docs/DESIGN.md.Stacked on #1 (scaffold). Until #1 merges this diff also shows the scaffold. After it merges, the diff is only
docs/DESIGN.md.Highlights:
upload/<profile>/,views/,reports/,results/andarchive/;ENDPOINTS_ONLYchroot./qqq/v1withUiApiInvokeron channelsftp, as the signed-in user. Masking, permissions and audits apply as in the UI.customizeAutomatedSessionForUser.com.kingsrook.qbits.filegateway.api), agreed with the qbit-edi agent. Bulk load is the default consumer.file_gateway_account,_ssh_key,_alias,_upload_job,_outbox_file,_transfer_logand_connection_log, plus the app home.Owner decisions recorded:
/qqq/v1only; SSH keys; SFTP only in v1 (FTPS documented as future); no files or filesystem, just the database and S3; the consumer and outbox API.Open for the owner: the LoadBalancer IP in 10.100.22.60–.69.
🤖 Generated with Claude Code