Skip to content
NewsGitHubDownload

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.1 and v1.0.0-beta.2, built from dev; 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, /healthz and /readyz probes, rejected-authentication events, JSON logs.
  • Cascades. type: chain groups with a check of every hop.
  • Networking and DNS. Listeners on a unix socket, DNSCrypt v2, a BitTorrent sniffer and the PROTOCOL rule, trusted-proxy-header from 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 a core field in GET /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/crypto and x/text are on current releases with their security fixes. The separate builds on old Go versions (-go120 to -go125) are gone; see Migrating from mihomo.
  • Forks. utls v1.8.8-citrus.1–.3, tls v0.1.8-citrus.1, http v0.1.8-citrus.1–.2; utls and tls have dev commits 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.
  • 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.mod with the getmikan forks, as Citrus does;
    • take events from /events instead of polling /traffic/users, /limits/users and 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.
  • 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.txt in 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.
  • 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 dev commits after their -citrus tags.