Nov 11, 8-9 PM (17)
Nov 11, 9-10 PM (24)
Nov 11, 10-11 PM (34)
Nov 11, 11-12 AM (20)
Nov 12, 12-1 AM (4)
Nov 12, 1-2 AM (2)
Nov 12, 2-3 AM (6)
Nov 12, 3-4 AM (5)
Nov 12, 4-5 AM (5)
Nov 12, 5-6 AM (3)
Nov 12, 6-7 AM (15)
Nov 12, 7-8 AM (36)
Nov 12, 8-9 AM (51)
Nov 12, 9-10 AM (53)
Nov 12, 10-11 AM (32)
Nov 12, 11-12 PM (46)
Nov 12, 12-1 PM (56)
Nov 12, 1-2 PM (48)
Nov 12, 2-3 PM (21)
Nov 12, 3-4 PM (29)
Nov 12, 4-5 PM (59)
Nov 12, 5-6 PM (15)
Nov 12, 6-7 PM (15)
Nov 12, 7-8 PM (16)
Nov 12, 8-9 PM (10)
Nov 12, 9-10 PM (15)
Nov 12, 10-11 PM (33)
Nov 12, 11-12 AM (14)
Nov 13, 12-1 AM (12)
Nov 13, 1-2 AM (8)
Nov 13, 2-3 AM (6)
Nov 13, 3-4 AM (8)
Nov 13, 4-5 AM (2)
Nov 13, 5-6 AM (3)
Nov 13, 6-7 AM (27)
Nov 13, 7-8 AM (28)
Nov 13, 8-9 AM (55)
Nov 13, 9-10 AM (72)
Nov 13, 10-11 AM (54)
Nov 13, 11-12 PM (42)
Nov 13, 12-1 PM (40)
Nov 13, 1-2 PM (109)
Nov 13, 2-3 PM (36)
Nov 13, 3-4 PM (43)
Nov 13, 4-5 PM (27)
Nov 13, 5-6 PM (58)
Nov 13, 6-7 PM (14)
Nov 13, 7-8 PM (14)
Nov 13, 8-9 PM (32)
Nov 13, 9-10 PM (13)
Nov 13, 10-11 PM (23)
Nov 13, 11-12 AM (19)
Nov 14, 12-1 AM (3)
Nov 14, 1-2 AM (3)
Nov 14, 2-3 AM (2)
Nov 14, 3-4 AM (3)
Nov 14, 4-5 AM (26)
Nov 14, 5-6 AM (2)
Nov 14, 6-7 AM (10)
Nov 14, 7-8 AM (11)
Nov 14, 8-9 AM (30)
Nov 14, 9-10 AM (38)
Nov 14, 10-11 AM (49)
Nov 14, 11-12 PM (39)
Nov 14, 12-1 PM (42)
Nov 14, 1-2 PM (31)
Nov 14, 2-3 PM (36)
Nov 14, 3-4 PM (21)
Nov 14, 4-5 PM (18)
Nov 14, 5-6 PM (29)
Nov 14, 6-7 PM (22)
Nov 14, 7-8 PM (14)
Nov 14, 8-9 PM (8)
Nov 14, 9-10 PM (5)
Nov 14, 10-11 PM (31)
Nov 14, 11-12 AM (25)
Nov 15, 12-1 AM (30)
Nov 15, 1-2 AM (7)
Nov 15, 2-3 AM (1)
Nov 15, 3-4 AM (2)
Nov 15, 4-5 AM (0)
Nov 15, 5-6 AM (0)
Nov 15, 6-7 AM (3)
Nov 15, 7-8 AM (2)
Nov 15, 8-9 AM (2)
Nov 15, 9-10 AM (3)
Nov 15, 10-11 AM (3)
Nov 15, 11-12 PM (11)
Nov 15, 12-1 PM (4)
Nov 15, 1-2 PM (0)
Nov 15, 2-3 PM (9)
Nov 15, 3-4 PM (6)
Nov 15, 4-5 PM (1)
Nov 15, 5-6 PM (1)
Nov 15, 6-7 PM (13)
Nov 15, 7-8 PM (11)
Nov 15, 8-9 PM (22)
Nov 15, 9-10 PM (4)
Nov 15, 10-11 PM (19)
Nov 15, 11-12 AM (26)
Nov 16, 12-1 AM (1)
Nov 16, 1-2 AM (2)
Nov 16, 2-3 AM (4)
Nov 16, 3-4 AM (3)
Nov 16, 4-5 AM (1)
Nov 16, 5-6 AM (0)
Nov 16, 6-7 AM (0)
Nov 16, 7-8 AM (0)
Nov 16, 8-9 AM (6)
Nov 16, 9-10 AM (6)
Nov 16, 10-11 AM (1)
Nov 16, 11-12 PM (3)
Nov 16, 12-1 PM (3)
Nov 16, 1-2 PM (6)
Nov 16, 2-3 PM (5)
Nov 16, 3-4 PM (10)
Nov 16, 4-5 PM (4)
Nov 16, 5-6 PM (8)
Nov 16, 6-7 PM (11)
Nov 16, 7-8 PM (14)
Nov 16, 8-9 PM (4)
Nov 16, 9-10 PM (9)
Nov 16, 10-11 PM (38)
Nov 16, 11-12 AM (24)
Nov 17, 12-1 AM (0)
Nov 17, 1-2 AM (7)
Nov 17, 2-3 AM (4)
Nov 17, 3-4 AM (4)
Nov 17, 4-5 AM (3)
Nov 17, 5-6 AM (8)
Nov 17, 6-7 AM (7)
Nov 17, 7-8 AM (36)
Nov 17, 8-9 AM (40)
Nov 17, 9-10 AM (29)
Nov 17, 10-11 AM (83)
Nov 17, 11-12 PM (32)
Nov 17, 12-1 PM (49)
Nov 17, 1-2 PM (47)
Nov 17, 2-3 PM (51)
Nov 17, 3-4 PM (41)
Nov 17, 4-5 PM (29)
Nov 17, 5-6 PM (23)
Nov 17, 6-7 PM (27)
Nov 17, 7-8 PM (26)
Nov 17, 8-9 PM (18)
Nov 17, 9-10 PM (25)
Nov 17, 10-11 PM (27)
Nov 17, 11-12 AM (28)
Nov 18, 12-1 AM (7)
Nov 18, 1-2 AM (6)
Nov 18, 2-3 AM (8)
Nov 18, 3-4 AM (7)
Nov 18, 4-5 AM (3)
Nov 18, 5-6 AM (5)
Nov 18, 6-7 AM (1)
Nov 18, 7-8 AM (15)
Nov 18, 8-9 AM (35)
Nov 18, 9-10 AM (38)
Nov 18, 10-11 AM (65)
Nov 18, 11-12 PM (61)
Nov 18, 12-1 PM (31)
Nov 18, 1-2 PM (43)
Nov 18, 2-3 PM (43)
Nov 18, 3-4 PM (40)
Nov 18, 4-5 PM (33)
Nov 18, 5-6 PM (18)
Nov 18, 6-7 PM (30)
Nov 18, 7-8 PM (2)
Nov 18, 8-9 PM (0)
3,397 commits this week Nov 11, 2025 - Nov 18, 2025
fix: navigation to notifications center when last notification is removed
For some reason (at least to me, unknown), the notifications returned by useNotificationsCenter
hook is initially undefined.
This means that when the last notification is removed, the hook returns undefined and the
navigation to the notifications center is not triggered.
Changed the check: when notifications is not undefined, even if an empty array, the navigation
must be triggered.
fix(cardano): add rate limiting to prevent resource exhaustion during indexing
Implement interval-based rate limiting (~100 blocks/sec) in the subscription
loop to prevent memory exhaustion and system freezes during blockchain indexing.

The network can produce hundreds of blocks per second during historical sync,
but WASM processing is significantly slower (~30-50 blocks/sec). Without rate
limiting, resources accumulate in the DashMap faster than they can be consumed,
leading to unbounded memory growth and eventual OOM kills.

The rate limiter works in conjunction with the bounded event queue (10K capacity)
to provide complete backpressure control. Resources are created before the bounded
channel send() can block, so throttling at the production point is essential.

Changes:
- Add BLOCK_RATE_LIMIT_MS constant (10ms interval)
- Replace tokio::select! on follower.next() with interval-based tick
- Set MissedTickBehavior::Skip to prevent tick accumulation
- Add detailed comments explaining the resource lifecycle and why both
  bounded channels and rate limiting are necessary

This replaces the previous sleep-based throttle with a more idiomatic
tokio::time::interval approach that explicitly controls block polling rate.
feat(cat-voices): add web file compression (#485)
* feat: add web file compression

* fix: add `glsl` to project dic

* move installation to flutter-base

* add flutter web and linux precache step in Earthfile

* refactor

* refactor

* test fix

* test fix

* test fix

* test fix

* back to previous config

* set flutter version to 3.35.1

* add .mjs file compression

* parameterize compression levels

* correct variable name for Brotli compression level
fix(cardano): add rate limiting to prevent resource exhaustion during indexing
Implement interval-based rate limiting (~100 blocks/sec) in the subscription
loop to prevent memory exhaustion and system freezes during blockchain indexing.

The network can produce hundreds of blocks per second during historical sync,
but WASM processing is significantly slower (~30-50 blocks/sec). Without rate
limiting, resources accumulate in the DashMap faster than they can be consumed,
leading to unbounded memory growth and eventual OOM kills.

The rate limiter works in conjunction with the bounded event queue (10K capacity)
to provide complete backpressure control. Resources are created before the bounded
channel send() can block, so throttling at the production point is essential.

Changes:
- Add BLOCK_RATE_LIMIT_MS constant (10ms interval)
- Replace tokio::select! on follower.next() with interval-based tick
- Set MissedTickBehavior::Skip to prevent tick accumulation
- Add detailed comments explaining the resource lifecycle and why both
  bounded channels and rate limiting are necessary

This replaces the previous sleep-based throttle with a more idiomatic
tokio::time::interval approach that explicitly controls block polling rate.