Roadmap
The roadmap covers every getmikan repository: the Citrus core and the utls, tls, http, smux and restls-client-go forks. Moving the Mikan panel to Citrus depends on the core, so it is here too. This is a plan, not a schedule.
The details, with a link to every PR, are in the changelog.
- Releases. The beta releases
v1.0.0-beta.1andv1.0.0-beta.2, built fromdev; see the second beta’s news post. - Xray compatibility. Post-quantum REALITY on the client and the server (X25519MLKEM768, ML-DSA-65), XHTTP with Xray’s behaviour, ECH keys and links in Xray’s formats. Automated tests against Xray v26.10.10 in CI.
- Users in the core. Multi-user Shadowsocks 2022, traffic and online-address stats, limits on speed, connections, addresses, quota and expiry, inbound users changed without a restart,
PUT /rules. - Events and observability.
GET /events(WebSocket, SSE, NDJSON), Prometheus/metrics,/healthzand/readyzprobes, rejected-authentication events, JSON logs. - Cascades.
type: chaingroups with a check of every hop. - Networking and DNS. Listeners on a unix socket, DNSCrypt v2, a BitTorrent sniffer and the
PROTOCOLrule,trusted-proxy-headerfrom trusted proxies. - Cleanup. VMess, SSR, Hysteria v1, TUIC v4, Shadowsocks stream ciphers, v2ray-plugin and mKCP removed.
- Hardening. A security review, a code review and a static audit, all closed with fixes, including the remaining findings on server handshakes, fallback, 0-RTT replay and the utls and ResTLS forks (#140–#142, #148); TLS 1.2 minimum; self-update checked against
checksums.txt; CI pinned by digest. See Security. - Performance. Upload: write batching, up to +50% on REALITY, Trojan and SS2022 (#119). Download: 64 KiB reads and TLS records sent to the socket together, with 32 streams REALITY 2802 → 4235 MB/s, Trojan 2737 → 3936, SS2022 3895 → 4392 (#124). Latency under load: an echo next to eight downloads 55–63 → 20 ms (#131). Idle tunnel memory: Trojan −36%, AnyTLS −18%, REALITY −12% (#129). QUIC: the gap to sing-box on new streams 10–12% → 4–6% (#125); fewer allocations per new connection (#118). Earlier: XHTTP over h2 uses half the CPU per gigabyte, an idle connection takes 30 KB less memory.
- AnyTLS. A rework (#130): with 32 streams download is twice as fast, upload +23%, ahead of sing-box; the client race is gone.
- For servers and panels. PROXY protocol v1 and v2 on the TCP inbounds for front ends such as an SNI router (#136); non-root systemd and Docker profiles (#144); one-time tickets for controller WebSockets instead of the secret in the URL (#143); the User-Agent
clash.meta/<version> citrus/<version>(#146) and acorefield inGET /version(#147), so panels and apps tell Citrus from mihomo. - Comparison and measurements. A comparison of four servers, Xray, sing-box, mihomo and Citrus, on eight protocols (#126); a nightly performance check in CI against mihomo (#127).
- Client compatibility. Automated tests: mihomo v1.19.31 and v1.19.32 clients against a Citrus server on every protocol, see Compatibility.
- Go 1.26. The minimum Go version is 1.26, so
golang.org/x/net,x/cryptoandx/textare on current releases with their security fixes. The separate builds on old Go versions (-go120to-go125) are gone; see Migrating from mihomo. - Forks. utls
v1.8.8-citrus.1–.3, tlsv0.1.8-citrus.1, httpv0.1.8-citrus.1–.2; utls and tls havedevcommits after these tags (download, memory). The new smux fork stops a caller’s buffer from being sent after an error, and the restls-client-go fork fixes its record-counter races; neither has a tag yet. - Documentation. The site in two languages: getting started, configuration, controller, users, limits, metrics, events, chains, migrating from mihomo.
In progress
Section titled “In progress”- MikanApp on Citrus. The app is built with the Citrus core; its About screen names the core after the core itself — Citrus or Mihomo.
- Moving the Mikan panel to Citrus. The panel embeds the core as a library, and the move depends on the first release:
- replace utls, tls, http and smux in the panel’s
go.modwith the getmikan forks, as Citrus does; - take events from
/eventsinstead of polling/traffic/users,/limits/usersand the other endpoints; - set a controller
secret: without one the core will not open the controller on a network address; - move custom node configs that use VMess, which Citrus removed, to VLESS.
- replace utls, tls, http and smux in the panel’s
- A live check. A test node on Citrus and a phone checklist: connecting with every protocol in the subscription, network switches and airplane mode, speed, stats and limits in the panel.
- English docs on par with Russian. The site pages exist in both languages; next are the comments in
docs/config.yaml, which are still mostly in Chinese, as in mihomo.
- Shadowsocks 2022 performance. Every connection currently allocates two 64 KB buffers up front; in all, sing-shadowsocks allocates about 150 KiB per connection in advance. The plan is a sing-shadowsocks fork that takes buffers only while data flows.
- Release signing. Sign
checksums.txtin CI and verify the signature with a key built into Citrus on self-update. - Verify downloaded dashboards and geodata.
- Further hardening. More reviews and audits as the code grows.
Needs a decision
Section titled “Needs a decision”- Weekly sync from mihomo. The workflow is ready and tested, but to let it open PRs the repository settings must allow GitHub Actions to create pull requests.
- A sing-quic fork. Hysteria2 padding costs about 4% CPU per stream; fixing it needs a fork of sing-quic.
- The TUIC stream limit. The TUIC server accepts at most 2048 streams per QUIC connection; a sing-box client, which does not wait for stream credit, gets errors past that.
- Release tags for the smux, tls and utls forks. smux has no tags yet, and tls and utls have
devcommits after their-citrustags.
