Files
git.stella-ops.org/docs/33_333_QUOTA_OVERVIEW.md
2025-08-30 21:05:34 +00:00

4.7 KiB
Executable File
Raw Permalink Blame History

FreeTier Quota — {{ quota_anon }}/{{ quota_token }} Scans per UTC Day

StellaOps is free for individual developers and small teams.
To avoid registry abuse the scanner enforces a twotier daily quota — fully offline capable.

Mode Daily ceiling How to obtain
Anonymous {{ quota_anon }} scans No registration. Works online or airgapped.
Free JWT token {{ quota_token }} scans Email token@stella-ops.org (blank body). Bot replies with a signed JWT.

Soft reminder banner appears at 200 scans. Exceeding the limit never blocks
the CLI/UI introduce a delay, detailed below.


1·Token structure

{
  "iss": "stella-ops.org",
  "sub": "free-tier",
  "tid": "7d2285…",      // 32byte random tokenID
  "tier": {{ quota_token }}, // daily scans allowed
  "exp": 1767139199      // POSIX seconds (mandatory)  token expiry
}
  • The tokenID (tid) not the email is hashed (SHA256 + salt) and stored for counter lookup.
  • Verification uses the bundled public key (keys/cosign.pub) so offline hosts validate tokens locally. An optional exp claim may be present; if absent, the default is a farfuture timestamp used solely for schema compatibility.

2·Enforcement algorithm (rev 2.1)

Step Operation Typical latency
1 key = sha256(ip) or sha256(tid) <0.1ms
2 count = INCR quota:<key> in Redis (24h TTL) 0.2ms (Lua)
3 If count > limitWAIT delay_ms first 30×5000ms → then 60000ms
4 Return HTTP429 only if delay > 60s (should never fire under free tier)

Counters reset at 00:00UTC.


3·CLI / API integration

# Example .env                                    
docker run --rm \
  -e DOCKER_HOST="$DOCKER_HOST" \                       # remotedaemon pointer
  -v "$WORKSPACE/${SBOM_FILE}:/${SBOM_FILE}:ro" \       # mount SBOM under same name at container root
  -e STELLA_OPS_URL="https://${STELLA_URL}" \           # where the CLI posts findings
  "$STELLA_URL/registry/stella-cli:latest" \
    scan --sbom "/${SBOM_FILE}" "$IMAGE"

No JWT? → scanner defaults to anonymous quota.


4·Data retention & privacy

Data Retention Purpose
IP hash (quota:ip:*) 7days, then salted hash only Abuse ratelimit
TokenID hash Until revoked Counter lookup
Email (token request) 7days unless newsletters optedin Deliver the JWT

No personal data leaves your infrastructure when running offline.


5·Common questions

What happens at exactly 200 scans?

The UI/CLI shows a yellow “fairuse reminder”. No throttling is applied yet. Once you cross the full limit, the first 30 overquota scans incur a 5second delay; further excess scans delay 60s each.

Does the quota differ offline?

No. Counters are evaluated locally in Redis; the same limits apply even without Internet access.

Can I reset counters manually?

Yes delete the quota:* keys in Redis, but we recommend letting them expire at midnight to keep statistics meaningful.


6·Revision history

Version Date Notes
2.1 20250716 Consolidated into single source; delays retuned (30×5s60s).
 2.0 20250407 Switched counters from Mongo to Redis.
 1.0 20241220 Initial freetier design.

Authoritative source — any doc or website section that references quotas must link to this file instead of duplicating text.