feat: resource caps, Saved Messages, author walls, docs for node bring-up
Node flags (cmd/node/main.go):
--max-cpu / --max-ram-mb — Go runtime caps (GOMAXPROCS / GOMEMLIMIT)
--feed-disk-limit-mb — hard 507 refusal for new post bodies over quota
--chain-disk-limit-mb — advisory watcher (can't reject blocks without
breaking consensus; logs WARN every minute)
Client — Saved Messages (self-chat):
- Auto-created on sign-in, pinned top of chat list, blue bookmark avatar
- Send short-circuits the relay (no encrypt, no fee, no mailbox hop)
- Empty state rendered outside inverted FlatList — fixes the mirrored
"say hi…" on Android RTL-aware layout builds
- PostCard shows "You" for own posts instead of the self-contact alias
Client — user walls:
- New route /(app)/feed/author/[pub] with infinite-scroll via
`created_at` cursor and pull-to-refresh
- Profile screen gains "View posts" button (universal) next to
"Open chat" (contact-only)
Feed pipeline:
- Bump client JPEG quality 0.5 → 0.75 to match server scrubber (Q=75),
so a 60 KiB compose doesn't balloon past 256 KiB after server re-encode
- ErrPostTooLarge now wraps with the actual size vs cap, errors.Is
preserved in the HTTP layer
- FeedMailbox quota + DiskUsage surface — supports new CLI flag
README:
- Step-by-step "first node / joiner" section on the landing page,
full flag tables incl. the new resource-cap group, minimal
checklists for open/private/low-end deployments
This commit is contained in:
@@ -42,7 +42,18 @@ import { safeBack } from '@/lib/utils';
|
||||
const MAX_CONTENT_LENGTH = 4000;
|
||||
const MAX_POST_BYTES = 256 * 1024; // must match server's MaxPostSize
|
||||
const IMAGE_MAX_DIM = 1080;
|
||||
const IMAGE_QUALITY = 0.5; // JPEG Q=50 — small, still readable
|
||||
// Match the server scrubber's JPEG quality (media/scrub.go:ImageJPEGQuality
|
||||
// = 75). If the client re-encodes at a LOWER quality the server re-encode
|
||||
// at 75 inflates the bytes, often 2-3× — so a 60 KiB upload silently blows
|
||||
// past MaxPostSize = 256 KiB mid-flight and `/feed/publish` rejects with
|
||||
// "post body exceeds maximum allowed size". Using the same Q for both
|
||||
// passes keeps the final footprint ~the same as what the user sees in
|
||||
// the composer.
|
||||
const IMAGE_QUALITY = 0.75;
|
||||
// Safety margin on the pre-upload check: the server pass is near-idempotent
|
||||
// at matching Q but not exactly — reserve ~8 KiB for JPEG header / metadata
|
||||
// scaffolding differences so we don't flirt with the hard cap.
|
||||
const IMAGE_BUDGET_BYTES = MAX_POST_BYTES - 8 * 1024;
|
||||
|
||||
interface Attachment {
|
||||
uri: string;
|
||||
@@ -131,10 +142,10 @@ export default function ComposeScreen() {
|
||||
});
|
||||
const bytes = base64ToBytes(b64);
|
||||
|
||||
if (bytes.length > MAX_POST_BYTES - 512) {
|
||||
if (bytes.length > IMAGE_BUDGET_BYTES) {
|
||||
Alert.alert(
|
||||
'Image too large',
|
||||
`Image is ${Math.round(bytes.length / 1024)} KB but the limit is ${MAX_POST_BYTES / 1024} KB. Try picking a smaller one.`,
|
||||
`Image is ${Math.round(bytes.length / 1024)} KB but the post limit is ${MAX_POST_BYTES / 1024} KB (after server re-encode). Try a smaller picture.`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user