8 Commits
Author SHA1 Message Date
kazeyukiro 8af3d34589 docs: fix website URLs (/guide not /docs/guide) 2026-10-03 05:57:05 +00:00
kazeyukiro 7bdf35ba5b docs: point technical guides at 3m-ui.top; keep docs/readme/
Full documentation lives on the VitePress site (zh + en). Repository
docs/*.md are short stubs with links. Multilingual README files remain
under docs/readme/. Offline AI install prompts (.txt) are retained.
2026-10-03 05:52:05 +00:00
kazeyukiro 3bb1abe43a docs: document POST /users/quick in OpenAPI and user guides 2026-09-24 14:51:09 +00:00
kazeyukiro 79e6c778a1 chore: remove HWID feature (subscription device binding) 2026-09-21 00:00:00 +08:00
kazeyukiro e89750f9d0 docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
docs: align README/OpenAPI with per-node traffic, limits, backups
- docs/node-traffic.md; feature tables; installation backup cleanup note
- OpenAPI: traffic_multiplier, GET /users/{id}/node-traffic
2026-09-20 23:55:00 +08:00
kazeyukiro aab6c17745 fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
fix(hwid): more reliable device registration + client header aliases
- Upsert on (proxy_user_id, hwid); log registered/seen for diagnosis
- Accept x-device-id / x-hardware-id / ?hwid= aliases
- Response x-hwid-limit for v2rayTUN when limit active
- Docs: which clients actually send HWID (Clash stock does not)
2026-09-20 22:55:00 +08:00
kazeyukiro fa1744eef7 fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
fix(hwid): never 500 subscriptions; fail-open tracking when unlimited
Root cause: hwid_limit=0 still tried to INSERT/UPDATE devices; any DB error
returned 500 and blocked the whole subscription (Happ always sends x-hwid).
- limit<=0: best-effort track only, never deny
- limit>0: require x-hwid; deny only when over device cap
- Accept broader client HWID strings (4–128, strip controls)
- Router: only 403 for MaxDevices/Required; ignore other errors
2026-09-20 06:05:00 +08:00
kazeyukiro b6996ae2fb docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
docs: align README, OpenAPI, and docs with current limits/certs/subs
- Feature tables: IP 5s poll, HWID require x-hwid, sub_pull_limit, batch cert
- docs/users-limits.md, batch-certificate.md, subscription-formats.md
- OpenAPI ProxyUser + POST /nodes/batch/certificate
2026-09-20 01:15:00 +08:00