Skip to content

Bandwidth & scheduling

Status: Accepted · Audience: Operator · Area: D — Content & household


Stop the stack from ruining the household’s internet.

A media stack saturates whatever connection it’s given. Unconstrained, a large grab consumes the entire uplink and downlink, and the effect is felt immediately by everyone else in the house — video calls stutter, games lag, streaming buffers.

This is a social failure more than a technical one. The operator gets blamed, and the usual resolution is to stop running the stack during the day, or to stop running it at all. Meanwhile seeding obligations on private trackers push in the opposite direction.

There is also a hard constraint for many: metered connections with monthly data caps, where uncontrolled seeding is genuinely expensive.

Limits are expressed in shares, not just numbers

Section titled “Limits are expressed in shares, not just numbers”

Most operators don’t know their connection’s actual throughput in the units the download clients expect. Limits are therefore offered as a proportion of measured capacity as well as absolute figures, with the measured figure shown.

The useful shape is not arbitrary cron-like rules but the pattern every household has: constrained while people are awake and using the connection, unconstrained overnight.

Period Typical
Active hours Limited, so the connection stays usable
Quiet hours Unlimited

Defined once and applied to both download clients, rather than configured separately in SABnzbd and qBittorrent with different semantics.

Upload is limited separately, and defaults lower

Section titled “Upload is limited separately, and defaults lower”

Home connections are asymmetric — uplink is typically a fraction of downlink, and saturating it degrades everything, including downloads, because acknowledgements can’t get out.

Uploads are the more damaging direction and get a conservative default. But seeding is an obligation on private trackers, so throttling is preferred to stopping, and the ratio consequence of any limit is stated.

An operator who declares a monthly cap gets consumption tracked against it, with a warning before exhaustion — and seeding is the usual culprit, since it continues indefinitely without producing anything visible.

Limits apply to the stack, not the machine

Section titled “Limits apply to the stack, not the machine”

lemonfiber limits its own services. It does not attempt system-wide traffic shaping, which would require privileges it shouldn’t hold and would affect applications it has no business touching.

A one-off “unrestricted for the next hour” for when the operator wants something now and knows nobody else is affected. Time-boxed, so it can’t be forgotten and left on.

State Meaning
unlimited No limits configured
limited Limits active
scheduled-active Within active hours; limits applied
scheduled-quiet Within quiet hours; limits relaxed
overridden Temporary override in force, with expiry
cap-warning Approaching a declared data cap
cap-exceeded Cap reached; configured behaviour applied
Situation Behaviour
Operator doesn’t know their connection speed Offer to measure, and express limits as a proportion of the result.
Measured speed varies Re-measure periodically; don’t pin limits to a single stale reading.
Schedule boundary crossed mid-transfer Apply the new limit to the running transfer; don’t wait for it to finish.
Clock change or daylight saving Schedules follow local time and handle the transition without a gap or double application.
Seeding throttled below tracker requirements State the consequence for ratio; never silently jeopardise standing on a private tracker.
Data cap declared but usage unmeasurable Track what the stack itself transfers; state that other household usage isn’t counted.
Cap exceeded Apply the configured behaviour — pause, throttle heavily, or continue — as chosen in advance, not decided in the moment.
Override left running Time-boxed by design; expires automatically and reports that it did.
Download client ignores a limit Verify the limit was accepted; report if actual throughput exceeds it.
VPN adds overhead Note that measured throughput through the tunnel is lower than raw connection speed.
Household member streaming from Jellyfin Local traffic isn’t limited. Only external transfers are shaped.
Very slow connection Warn if limits would make transfers impractically slow.
ID Requirement
D10-R1 Limits MUST be expressible as a proportion of measured capacity as well as absolute values.
D10-R2 Measured connection capacity MUST be shown alongside any proportional limit.
D10-R3 Schedules MUST support active and quiet periods, defined once and applied to all download clients.
D10-R4 Upload limits MUST be configurable separately and MUST default more conservatively than download.
D10-R5 Any limit affecting seeding MUST state the ratio consequence.
D10-R6 Schedule boundaries MUST apply to in-progress transfers immediately.
D10-R7 Schedules MUST follow local time and MUST handle daylight-saving transitions without gaps or double application.
D10-R8 Declared data caps MUST be tracked against measured stack usage, with a warning before exhaustion.
D10-R9 Cap-exceeded behaviour MUST be configured in advance, not prompted at the time.
D10-R10 Data-cap tracking MUST state that non-stack household usage is not counted.
D10-R11 Temporary overrides MUST be time-boxed and MUST report on expiry.
D10-R12 lemonfiber MUST limit only its own services and MUST NOT perform system-wide traffic shaping.
D10-R13 Applied limits MUST be verified as accepted, and actual throughput exceeding a limit MUST be reported.
D10-R14 Local playback traffic MUST NOT be subject to bandwidth limits.

This page lives in another repository Rendered from lemonfiber/spec at 1d10402, 2026-09-09. Read the source of this page