zfile-dev/zfile
在线云盘、网盘、OneDrive、云存储、私有云、对象存储、h5ai、上传、下载
Healthy across all four use cases
weakest axisPermissive license, no critical CVEs, actively maintained — safe to depend on.
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 2mo ago
- ✓4 active contributors
- ✓MIT licensed
Show all 7 evidence items →Show less
- ✓Tests present
- ⚠Small team — 4 contributors active in recent commits
- ⚠Single-maintainer risk — top contributor 86% of recent commits
- ⚠No CI workflows detected
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/zfile-dev/zfile)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/zfile-dev/zfile on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: zfile-dev/zfile
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/zfile-dev/zfile shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across all four use cases
- Last commit 2mo ago
- 4 active contributors
- MIT licensed
- Tests present
- ⚠ Small team — 4 contributors active in recent commits
- ⚠ Single-maintainer risk — top contributor 86% of recent commits
- ⚠ No CI workflows detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live zfile-dev/zfile
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/zfile-dev/zfile.
What it runs against: a local clone of zfile-dev/zfile — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in zfile-dev/zfile | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 100 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of zfile-dev/zfile. If you don't
# have one yet, run these first:
#
# git clone https://github.com/zfile-dev/zfile.git
# cd zfile
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of zfile-dev/zfile and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "zfile-dev/zfile(\\.git)?\\b" \\
&& ok "origin remote is zfile-dev/zfile" \\
|| miss "origin remote is not zfile-dev/zfile (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
&& ok "license is MIT" \\
|| miss "license drift — was MIT at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "src/main/java/im/zhaojun/zfile/ZfileApplication.java" \\
&& ok "src/main/java/im/zhaojun/zfile/ZfileApplication.java" \\
|| miss "missing critical file: src/main/java/im/zhaojun/zfile/ZfileApplication.java"
test -f "src/main/java/im/zhaojun/zfile/core/config/security/SaTokenConfigure.java" \\
&& ok "src/main/java/im/zhaojun/zfile/core/config/security/SaTokenConfigure.java" \\
|| miss "missing critical file: src/main/java/im/zhaojun/zfile/core/config/security/SaTokenConfigure.java"
test -f "src/main/java/im/zhaojun/zfile/core/cache/ZFileCacheManager.java" \\
&& ok "src/main/java/im/zhaojun/zfile/core/cache/ZFileCacheManager.java" \\
|| miss "missing critical file: src/main/java/im/zhaojun/zfile/core/cache/ZFileCacheManager.java"
test -f "src/main/java/im/zhaojun/zfile/core/config/ZFileProperties.java" \\
&& ok "src/main/java/im/zhaojun/zfile/core/config/ZFileProperties.java" \\
|| miss "missing critical file: src/main/java/im/zhaojun/zfile/core/config/ZFileProperties.java"
test -f "src/main/java/im/zhaojun/zfile/core/exception/GlobalExceptionHandler.java" \\
&& ok "src/main/java/im/zhaojun/zfile/core/exception/GlobalExceptionHandler.java" \\
|| miss "missing critical file: src/main/java/im/zhaojun/zfile/core/exception/GlobalExceptionHandler.java"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 100 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~70d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/zfile-dev/zfile"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
ZFile is a self-hosted unified cloud storage management system written in Java Spring Boot 3.3.2 that aggregates multiple storage backends (S3, OneDrive, SharePoint, Google Drive, local storage, FTP, SFTP) into a single web interface. It enables individuals and small teams to browse, preview (images, video, audio, PDF, Office, 3D models), upload/download files, and generate expiring direct links across all connected storage sources without logging into each service separately. Monolithic Spring Boot 3 application with vertical layering: src/main/java/im/zhaojun/zfile/core/ contains cross-cutting concerns (annotations like @ApiLimit, @DemoDisable, aspects like ApiLimitAspect, cache management via ZFileCacheManager, config beans for datasource/Jackson/Knife4j documentation). Frontend assets likely in src/main/resources/. Deployment uses Dockerfile and shell scripts in .package/script/ (start.sh, stop.sh, restart.sh, status.sh).
👥Who it's for
Self-hosted cloud administrators, small teams, and individual users who manage files across multiple cloud providers and want a unified, privacy-respecting web interface instead of juggling separate login credentials. Contributors include Java/Spring Boot developers and DevOps engineers interested in multi-storage abstraction patterns.
🌱Maturity & risk
Production-ready and actively maintained. The project is at v4.5.0 (Spring Boot 3.3.2, Java 21), has published Docker images for amd64/arm64, includes comprehensive pre-built startup scripts in .package/script/, and maintains installation documentation. Regular commits and closed issue tracking indicate ongoing active development, though single-author maintenance is a concern.
Moderate risk due to single-maintainer pattern (zhaojun) visible in repo structure. Large dependency surface (AWS SDK BOM, multiple cloud SDKs, Jackson, MapStruct, Flyway, SQLite) increases supply chain exposure. No visible test directory in file structure suggests test coverage may be limited. Latest commit recency not shown but version jump (3.x → 4.5.0) indicates potential breaking changes between releases.
Active areas of work
No specific PR or milestone data visible in provided files, but recent version bump to 4.5.0 with Spring Boot 3.3.2 upgrade and Java 21 targeting indicates active modernization. .github/ISSUE_TEMPLATE/ shows structured issue tracking. Documentation site (docs.zfile.vip) and demo (demo.zfile.vip) are maintained, suggesting ongoing feature additions and bug fixes.
🚀Get running
git clone https://github.com/zfile-dev/zfile.git
cd zfile
mvn clean install
mvn spring-boot:run
Alternatively, one-liner installation: curl -sSL https://docs.zfile.vip/install.sh -o install.sh && chmod +x install.sh && ./install.sh
Daily commands:
mvn spring-boot:run
Or package and run: mvn clean package && java -jar target/zfile-4.5.0.jar. Docker: docker build -t zfile . && docker run -p 8080:8080 zfile. Default port is 8080 (inferred from Spring Boot standard).
🗺️Map of the codebase
src/main/java/im/zhaojun/zfile/ZfileApplication.java— Main Spring Boot application entry point; defines the core application lifecycle and bean initialization for the entire file management system.src/main/java/im/zhaojun/zfile/core/config/security/SaTokenConfigure.java— Configures authentication and authorization using SaToken; critical for understanding user access control across storage sources.src/main/java/im/zhaojun/zfile/core/cache/ZFileCacheManager.java— Manages all caching logic for file listings and storage metadata; essential for understanding performance optimization strategy.src/main/java/im/zhaojun/zfile/core/config/ZFileProperties.java— Centralized configuration properties holder; defines all configurable behavior for storage integration and system settings.src/main/java/im/zhaojun/zfile/core/exception/GlobalExceptionHandler.java— Global error handling and exception mapping; essential for understanding how all errors propagate to clients.src/main/java/im/zhaojun/zfile/core/config/mybatis/MyBatisPlusConfig.java— MyBatis Plus ORM configuration; manages all database access patterns and entity mappings for storage metadata persistence.pom.xml— Maven dependency manifest defining Spring Boot 3.3.2, storage SDKs, and all critical libraries for multi-storage support.
🛠️How to make changes
Add a new Storage Source Type
- Create a storage provider class implementing the storage API interface in src/main/java/im/zhaojun/zfile/module/storage/model (not shown in file list but follows Spring pattern) (
src/main/java/im/zhaojun/zfile/core/config/spring/StringToEnumConverterFactory.java) - Register the converter factory to handle enum parsing of your new storage type (
src/main/java/im/zhaojun/zfile/core/config/spring/WebMvcConfig.java) - Add storage credentials and configuration properties to the system (
src/main/java/im/zhaojun/zfile/core/config/ZFileProperties.java) - Create an API controller endpoint to handle storage-specific operations (
src/main/java/im/zhaojun/zfile/core/controller/FrontIndexController.java)
Add a new API Endpoint with Rate Limiting
- Create a new REST controller method in src/main/java/im/zhaojun/zfile/module/system/controller (pattern location) (
src/main/java/im/zhaojun/zfile/core/annotation/ApiLimit.java) - Decorate the method with @ApiLimit annotation to enable rate limiting (
src/main/java/im/zhaojun/zfile/core/aspect/ApiLimitAspect.java) - Define custom error response using ErrorCode enum if rate limit exceeded (
src/main/java/im/zhaojun/zfile/core/exception/ErrorCode.java) - Response will be automatically wrapped by CommonResultControllerAdvice (
src/main/java/im/zhaojun/zfile/core/aspect/CommonResultControllerAdvice.java)
Implement a Cached Query
- Inject ZFileCacheManager into your service class (
src/main/java/im/zhaojun/zfile/core/cache/ZFileCacheManager.java) - Configure Spring Cache with @Cacheable annotation on your service methods (
src/main/java/im/zhaojun/zfile/core/config/spring/SpringCacheConfig.java) - Customize Redis serialization using Jackson if needed (
src/main/java/im/zhaojun/zfile/core/config/security/SaTokenDaoRedisJackson.java) - Cache TTL and eviction policy configured via ZFileProperties (
src/main/java/im/zhaojun/zfile/core/config/ZFileProperties.java)
Add a Custom Exception Type
- Create new exception class extending BizException in src/main/java/im/zhaojun/zfile/core/exception/biz/ (
src/main/java/im/zhaojun/zfile/core/exception/core/BizException.java) - Register error code in ErrorCode enum with HTTP status and message (
src/main/java/im/zhaojun/zfile/core/exception/ErrorCode.java) - GlobalExceptionHandler automatically maps exception to standardized response (
src/main/java/im/zhaojun/z)
🪤Traps & gotchas
Java 21 requirement: pom.xml explicitly targets <java.version>21</java.version>; building with Java 17 will fail. Flyway migrations: flyway.version 10.12.0 is configured, so SQLite schemas must be versioned in src/main/resources/db/migration/; manual SQL edits outside Flyway can cause upgrade failures. Spring Boot 3.3.2 Jakarta EE breaking change: old javax.* imports will not work; ensure all imports use jakarta.*. SQLite limitations: SQLite JDBC 3.46.0.1 has concurrency bottlenecks under high-load file uploads; not suitable for large teams. Knife4j docs endpoint: API documentation likely exposed at /doc.html by default; may leak internal API structure in production without proper security filtering. MapStruct annotation processing: requires Maven compiler plugin configuration (verify maven-compiler-plugin in pom.xml includes annotationProcessorPaths).
💡Concepts to learn
- Storage Abstraction Layer / Provider Pattern — ZFile's core value is hiding implementation details of S3, OneDrive, FTP, etc. behind a unified interface. Understanding how different storage backends are abstracted (likely via interfaces/abstract classes) is essential to adding new storage types or debugging backend-specific bugs.
- Aspect-Oriented Programming (AOP) —
ApiLimitAspectandDemoDisableAspectshow cross-cutting concerns injected via@Aspectannotations. This pattern decouples rate-limiting and feature toggles from business logic; critical for understanding how global behaviors are applied to all endpoints. - Multi-Tenancy / Dynamic DataSource Routing —
DataSourceBeanPostProcessorsuggests support for multiple storage sources per user or role. Understanding how connections are routed at runtime is vital for the multi-user feature mentioned in README (per-user storage assignments). - Distributed Caching Strategy —
ZFileCacheManagerabstracts caching logic across multiple remote storage backends with different latencies. Cache invalidation bugs (stale files after upload) are high-risk; understanding TTL, key generation, and eviction is crucial. - Spring Boot Auto-Configuration and Property Binding —
ZFileProperties.javacentralizes all config as typed beans via@ConfigurationProperties. This enables externalized config (application.yml) without code changes; essential for Docker/Kubernetes deployments. - Direct Link / Token-Based Download Expiry — README mentions 'generate direct links' with optional expiration. This likely involves cryptographic tokens (JWT or session-based) with time-limited validity; understanding token lifecycle prevents security bugs like indefinite access or token reuse.
- Flyway Database Migration — Flyway 10.12.0 manages SQLite schema versioning across releases. Adding new features often requires schema changes; understanding how migrations are versioned (
V1__*.sql,V2__*.sql) prevents conflicts and data loss.
🔗Related repos
cloudreve/Cloudreve— Chinese-developed self-hosted cloud storage UI; similar multi-storage aggregation and file preview features, written in Go instead of Javanextcloud/server— Mature PHP-based self-hosted file sync platform; broader enterprise features but heavier than ZFile; shares storage-agnostic architecture goalsminio/minio— S3-compatible object storage server; complementary backend that ZFile can connect to as a storage sourcecmlh/aspnetcore-cloud-drive— Multi-cloud aggregation in .NET; demonstrates similar architectural patterns for unified cloud storage interface in different ecosystemspring-projects/spring-cloud— Spring Cloud parent project for cloud-native patterns; ZFile could adopt service discovery and config server from Spring Cloud for horizontal scaling
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive unit tests for core storage abstraction layer
The repo lacks visible test coverage for the storage abstraction implementations. With multiple storage types (OneDrive, local, S3, etc.) being managed, adding unit tests for src/main/java/im/zhaojun/zfile/core would significantly improve reliability. This is critical given the file browser/upload/download functionality where bugs could cause data loss.
- [ ] Create src/test/java/im/zhaojun/zfile/core directory structure mirroring main
- [ ] Add unit tests for storage adapter implementations (likely in src/main/java/im/zhaojun/zfile/core/storage or similar, not shown in file list)
- [ ] Test cache manager behavior in ZFileCacheManager.java with mock cache backends
- [ ] Add integration tests for SaTokenDaoRedisJackson.java security token serialization/deserialization
- [ ] Ensure >80% code coverage for core package and add coverage reporting to CI
Add GitHub Actions workflow for automated Docker image builds and releases
The repo contains a Dockerfile but no visible CI/CD pipeline for building and publishing Docker images. Given this is a deployable application with a .package/script directory for deployment, automating Docker builds on release tags would significantly improve distribution and reduce manual deployment burden.
- [ ] Create .github/workflows/docker-build.yml that triggers on version tags (v*..))
- [ ] Build Docker image using the existing Dockerfile, tag it with version and latest
- [ ] Push to a public registry (Docker Hub or GitHub Container Registry)
- [ ] Add image metadata labels (version, build date, maintainers)
- [ ] Document in README.md the available Docker images and usage instructions
Refactor datasource/MyBatis configuration and add database migration validation tests
The MyBatis configuration has multiple type handlers (CollectionIntegerTypeHandler, CollectionStrTypeHandler, CollectionTypeHandler) and custom components (MyDatabaseIdProvider, MyMetaObjectHandler, DataSourceBeanPostProcessor). These interdependent components lack visible tests. Combined with Flyway migrations (version 10.12.0 in pom.xml), this creates risk of migration failures in production.
- [ ] Create src/test/java/im/zhaojun/zfile/core/config/mybatis/ with tests for each custom TypeHandler
- [ ] Add integration test for DataSourceBeanPostProcessor.java to verify dynamic datasource configuration
- [ ] Create Flyway migration validation tests that verify all SQL migrations execute correctly against test databases (H2, SQLite)
- [ ] Test MyMetaObjectHandler.java with sample entities to ensure audit field population (likely created/updated timestamps)
- [ ] Document expected database schema in DEVELOPMENT.md or similar
🌿Good first issues
- Add integration tests for storage backends: No
src/testdirectory visible in file structure. Create unit tests forDataSourceBeanPostProcessorto verify dynamic datasource bean registration works correctly with different cloud provider configurations (S3, OneDrive, Google Drive). - Implement rate limit metrics endpoint:
ApiLimitAspect.javaexists but no metrics export. Add a/metrics/api-limitsendpoint that returns current rate limit state (requests remaining, reset time) using the@ApiLimitannotation metadata; useful for frontend to warn users before hitting limits. - Document cache invalidation strategy:
ZFileCacheManager.javalacks inline documentation on TTL, cache key structure, and invalidation triggers. Add JavaDoc explaining which operations (upload, delete, move) trigger cache eviction for each storage backend, since caching across multiple backends (S3, local, FTP) could cause stale data bugs.
⭐Top contributors
Click to expand
Top contributors
- @zhaojun1998 — 86 commits
- @Oniokey — 11 commits
- @aahowe — 2 commits
- @toint-cn — 1 commits
📝Recent commits
Click to expand
Recent commits
3fe5f5b— Update README.md by removing sponsors section (zhaojun1998)6e8a791— 修复 s3 对象存储加载签名器异常 bug (zhaojun1998)67b02fd— 管理员可删除其他用户的分享 (zhaojun1998)2049308— 修复分享文件夹启用权限校验 bug (zhaojun1998)ce6dbe0— 分享列表默认降序排序。 (zhaojun1998)0f05b50— 升级版本号到 4.5.0 (zhaojun1998)a0c4e9d— 修复阿里云,谷歌云,文件名前后包含空格时获取下载地址异常的 bug (zhaojun1998)743e828— 为管理员默认分配自定义分享链接,自定义分享链接 key权限 (zhaojun1998)bd8c924— 增加下载、打包下载、批量下载确认弹窗开关 (zhaojun1998)879d41b— 修复本地存储/代理下载返回的文件名在 safari 上乱码的 bug (zhaojun1998)
🔒Security observations
- High · Outdated Jackson Dependencies —
pom.xml - jackson-bom.version property. The pom.xml specifies jackson-bom.version as 2.14.1, which is significantly outdated. Current stable versions are 2.17.x+. This version contains multiple known CVEs including deserialization vulnerabilities that could lead to remote code execution. Fix: Update jackson-bom to version 2.17.0 or later. Review all Jackson-related dependencies for compatibility. - High · Outdated SnakeYAML Library —
pom.xml - snakeyaml.version property. snakeyaml.version is set to 2.0, which is outdated. Current stable versions are 2.2+. SnakeYAML 2.0 contains CVE-2023-35851 related to denial of service vulnerabilities in YAML parsing. Fix: Update snakeyaml to version 2.2 or later to patch known YAML parsing vulnerabilities. - Medium · Deprecated Spring Boot Version —
pom.xml - spring-boot-starter-parent version. Spring Boot 3.3.2 is being used, but version 3.4.x or 3.5.x are available with security patches and improvements. While 3.3.2 may still receive patches, using a more recent version ensures faster security updates. Fix: Upgrade to Spring Boot 3.4.x or later to ensure timely security patches. - Medium · Incomplete POM.xml File —
pom.xml - dependencies section. The provided pom.xml appears to be truncated mid-dependency declaration (GraalVM SDK dependency is incomplete). This makes it impossible to fully analyze all dependencies for vulnerabilities. The incomplete state suggests the file may not be properly validated. Fix: Provide complete pom.xml file and validate XML structure. Run 'mvn dependency-check' to scan all dependencies for known vulnerabilities. - Medium · Potential Path Traversal Vulnerability —
src/main/java/im/zhaojun/zfile/core/exception/biz/FilePathSecurityBizException.java and related controllers. The file structure indicates presence of 'FilePathSecurityBizException' suggesting path traversal protection attempts. However, without analyzing the actual controller and service code, file access patterns cannot be verified. The file browsing system is at high risk for path traversal attacks if not properly validated. Fix: Implement strict path canonicalization and validation. Use whitelist-based path validation. Never construct file paths from user input directly. Review all file access in FrontIndexController and storage modules. - Medium · Missing CORS and Security Headers Configuration —
src/main/java/im/zhaojun/zfile/core/config/spring/WebMvcConfig.java. While WebMvcConfig.java is present, without viewing its contents, proper CORS restrictions and security headers (CSP, X-Frame-Options, etc.) cannot be verified. The presence of file sharing/streaming features suggests CORS may be permissive. Fix: Configure restrictive CORS policies. Implement security headers: Content-Security-Policy, X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Strict-Transport-Security. - Medium · SQLi Risk in MyBatis Configuration —
src/main/java/im/zhaojun/zfile/core/config/mybatis/. Custom TypeHandlers and MyBatis configuration are present (CollectionTypeHandler, MyDatabaseIdProvider). Dynamic SQL construction through these handlers could be vulnerable if not properly parameterized. Fix: Audit all MyBatis XML mappings to ensure parameterized queries are used. Never construct SQL strings from user input. Use MyBatis parameterization exclusively. - Medium · Sensitive Data in Docker Image —
Dockerfile. The Dockerfile uses multi-stage build which is good practice, but the final image runs as root user (implicit). No explicit USER directive limits privileges, and no runtime security constraints (read-only filesystem, etc.) are configured. Fix: Add 'USER app-user' after installing dependencies. Use '--read-only' flag when running container. Add health checks. Consider
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.