Stoat
stoat.chat · Storage · 3 records · JSON
- Stoat (formerly Revolt) — official instance Storagecaveatemail?card?Rper-object-capdisagrees
- revolt/stoat public instance as bulk storage Storagefails: quotaemail?card?R
- Stoat (formerly Revolt) + Autumn file service Storagefails: quotaemail?card?Rper-object-capdisagrees
Stoat (formerly Revolt) — official instance Storage
caveatemail?card?Rper-object-capdisagrees
Sibling records disagree:
- verdict:
storage/stoat-autumn-file-servicesays fails-quota, storage/stoat-official-instance says qualifies-with-caveat
| Free tier | 20,000,000 bytes (20 MB) per attachment as the server-enforced default, no paid tier to raise it, and no documented total storage cap. unit MB; metered on stored-bytes |
|---|---|
| Price | none stated |
| Per-object cap | 20 MB per file (20000000 bytes) |
| Retention | | Critically different from Discord: attachment URLs are UNSIGNED and permanent |
| Egress | Free and unmetered from cdn.stoatusercontent.com (Cloudflare). The CDN responses I fetched carried Cache-Control: public, max-age=2073600 — 24 days of edge caching — which is good for the 500 GB/day serving workload. |
| Identity | email (placeholder) not published |
| Limits |
20 MB per file; 5 attachments per message; body_limit_size 20,000,000 bytes globally. Live limits object also gives: emojis 500 KB, icons 2.5 MB, banners/backgrounds 6 MB, avatars 4 MB — those are separate, smaller buckets. |
| Binding | per-object-cap the per-object cap sets the shard size and therefore the object count; it bounds the total more tightly than any headline quota |
| Interface | rest rest |
| Tooling | Autumn file service: POST {autumn}/attachments with multipart file and X-Bot-Token/X-Session-Token. Documented at stoatchat/stoatchat docs/docs/developers/api/uploading-files.md. Bots are first-class; 5 bots per account. |
| Composes with | 100 servers per account x 200 channels per server (from the live / limits object) = 20,000 channels, each with unlimited messages. Servers are capped at 100 for existing accounts / 50 for new ones. |
| Reliability | Critically different from Discord: attachment URLs are UNSIGNED and permanent. The platform renamed Revolt->Stoat in Oct 2025 and moved the CDN (autumn.revolt.chat -> cdn.revoltusercontent.com) in May 2025 with 301s still in place; old IDs from the pre-refactor Autumn do 404. |
| Notes | 20,000,000 bytes (20 MB) per attachment as the server-enforced default, no paid tier to raise it, and no documented total storage cap. |
| Evidence rung | reported One page read moves it to documented. |
| Checked | 2026-10-21 (inherited); stale on 2026-11-04 |
| Parsed numbers |
|
Evidence (4)
| date | source | what it proved |
|---|---|---|
| 2026-10-21 | api.stoat.chat/ | probe: GET -> features.limits.default.file_upload_size_limits.attachments = 20000000 (20 MB), server_channels = 200, servers = 100, message_attachments = 5 |
| 2026-10-21 | cdn.stoatusercontent.com/attachments/f749zVPTYPo_id3VY9IwZYM | probe: GET -> 200 OK, Content-Length 10886, Cache-Control: public, max-age=2073600 — no ex/is/hm, no expiry |
| 2026-10-21 | cdn.stoatusercontent.com/attachments | probe: POST with no auth -> 401 (upload requires a token; read does not) |
| 2026-10-21 | stoat.chat/ | 'Custom emojis, a 20MB file upload limit and a server-specific profile picture with no subscription required.' |
Unknown or withheld values (5)
$.free_tier.notesprocess$.identity_cost.detaildefaulted$.identity_cost.kindidentity-defaulted$.per_object_cap.notesnot-extracted$.retention.notesnot-extracted
revolt/stoat public instance as bulk storage Storage
fails: quotaemail?card?R
| Free tier | 20 MB per file with no paid tier and no public way to raise it, and the public instance runs signup human-verification step. 1 TiB = 52,000 files. Only self-hosting removes the cap, which is no longer free unit none; metered on none |
|---|---|
| Price | none stated |
| Per-object cap | not recorded |
| Retention | not recorded |
| Egress | not recorded |
| Identity | email (placeholder) not published |
| Binding | none no constraint of a named kind was recorded; the verdict rests on the quota sentence rather than on a named limit |
| Interface | unknown |
| Tooling | not recorded |
| Composes with | not recorded |
| Reliability | 20 MB per file with no paid tier and no public way to raise it, and the public instance runs signup human-verification step. 1 TiB = 52,000 files. Only self-hosting removes the cap, which is no longer free |
| Notes | 20 MB per file with no paid tier and no public way to raise it, and the public instance runs signup human-verification step. 1 TiB = 52,000 files. Only self-hosting removes the cap, which is no longer free |
| Evidence rung | reported |
| Checked | 2026-10-21 (inherited); stale on 2026-11-04 |
Evidence (2)
| date | source | what it proved |
|---|---|---|
| 2026-10-21 | stoat.chat/ | 20 MB per file with no paid tier and no public way to raise it, and the public instance runs signup human-verification step. 1 TiB = 52,000 files. Only self-hosting removes the cap, which is no longer free |
| 2026-10-21 | github.com/revoltchat/self-hosted/issues/53 | cited as the basis of the rejection: 20 MB per file with no paid tier and no public way to raise it, and the public instance runs signup human-verification step. 1 TiB = 52,000 files. Only self-hosting removes the cap, which is no longer free |
More fields (1)
{
"dead_end": {
"failure_class": "quota",
"why": "20 MB per file with no paid tier and no public way to raise it, and the public instance runs signup human-verification step. 1 TiB = 52,000 files. Only self-hosting removes the cap, which is no longer free",
"retry_when": null,
"first_recorded": "2026-10-21"
}
}Unknown or withheld values (15)
$.chainingnot-recorded$.confidence_notewithheld$.egress.termsnot-recorded$.extras.dead_end.retry_whenprocess$.free_tier.notesprocess$.identity_cost.detaildefaulted$.identity_cost.kindidentity-defaulted$.interfaceinterface-unknown$.interface_detailwithheld$.limits_noteprocess$.per_object_cap.notesnot-recorded$.per_object_cap.statednot-recorded$.retention.notesprocess$.retention.statednot-recorded$.toolingnot-recorded
Stoat (formerly Revolt) + Autumn file service Storage
fails: quotaemail?card?Rper-object-capdisagrees
Sibling records disagree:
- verdict:
storage/stoat-autumn-file-servicesays fails-quota, storage/stoat-official-instance says qualifies-with-caveat
| Free tier | 20 MB per file, no subscription: 'Custom emojis, a 20MB file upload limit and a server-specific profile picture with no subscription required.' No published total-storage cap and no paid tier that raises the file size. unit MB; metered on stored-bytes |
|---|---|
| Price | none stated |
| Per-object cap | 20 MB per file (20000000 bytes) |
| Retention | not stated |
| Egress | Free and — importantly — UNSIGNED. Autumn 301s to cdn.stoatusercontent.com and the object URL is a bare path with no expiry parameters, unlike Discord. So a stored URL stays valid and is trivially Cloudflare-cacheable. |
| Identity | email (placeholder) not published |
| Limits |
20 MB per file is fixed and low; there is no path to a bigger unit. Upload limits are server-configurable only on SELF-hosted instances ('Upload limits are controlled via the Autumn config'), so on the public instance you are stuck at 20 MB. |
| Binding | per-object-cap the per-object cap sets the shard size and therefore the object count; it bounds the total more tightly than any headline quota |
| Interface | rest rest |
| Tooling | Genuinely open: 'Our public API is so powerful that we use it ourselves for the official apps', API root answers live (GET https://api.revolt.chat/ -> {"stoat":"0.16.2","revolt":"0.16.2", features...}). Backend is open source (revoltchat/autumn, stoatchat/*). Self-hostable, which is both the appeal and the caveat. |
| Composes with | Unlimited servers x unlimited channels with a 20 MB cap, so 1 TB needs ~52,000 uploads. With no signed URLs, the reads are the easy part; the writes are the bottleneck. |
| Reliability | Smaller operator, recent rebrand to Stoat, and the public instance runs human-verification step on signup. Data longevity is a real question for a 20 TiB cold archive; treat as experimental. |
| Notes | 20 MB per file, no subscription: 'Custom emojis, a 20MB file upload limit and a server-specific profile picture with no subscription required.' No published total-storage cap and no paid tier that raises the file size. |
| Evidence rung | reported One page read moves it to documented. |
| Checked | 2026-10-21 (inherited); stale on 2026-11-04 |
| Parsed numbers |
|
Evidence (3)
| date | source | what it proved |
|---|---|---|
| 2026-10-21 | stoat.chat/ | 'Custom emojis, a 20MB file upload limit and a server-specific profile picture with no subscription required' |
| 2026-10-21 | autumn.revolt.chat/attachments/abc123 | probe: curl -D - -> 301 location: https://cdn.stoatusercontent.com/attachments/abc123 (no signature, no expiry params) |
| 2026-10-21 | api.revolt.chat/ | probe: curl -> 200, {"stoat":"0.16.2",...} — public API live |
More fields (1)
{
"dead_end": {
"failure_class": "quota",
"why": "20 MB per file, no subscription: 'Custom emojis, a 20MB file upload limit and a server-specific profile picture with no subscription required.' No published total-storage cap and no paid tier that raises the file size.",
"retry_when": null,
"first_recorded": "2026-10-21"
}
}Unknown or withheld values (7)
$.extras.dead_end.retry_whenprocess$.free_tier.notesprocess$.identity_cost.detaildefaulted$.identity_cost.kindidentity-defaulted$.per_object_cap.notesnot-extracted$.retention.notesnot-extracted$.retention.statednot-extracted