1. 30 Sep, 2026 1 commit
    • Stefy Lanza (nextime / spora )'s avatar
      compose: POST /v1/video/compose and POST /v1/files/upload (v0.2.22) · 5abbb81d
      Stefy Lanza (nextime / spora ) authored
      CoderAI could make every piece of a short video and nothing turned the pieces
      into a reel — assembly needs ffmpeg and two facts only the server has (how long
      the narration it just synthesised is, and when each word falls), so a detached
      client cannot do it. Requested by the Motus project over the HTTP API.
      
      - codai/api/compose.py: scenes -> one uploadable video. Scene length = narration
        + padding (min_duration floor), visuals split it evenly; async job with
        stage/progress/message/warnings, cancel (the ffmpeg child is killed), a queue
        that reports its position, and a blocking form for tests. Narration, music and
        word timings come from this server's own endpoints, called on a loop this
        module owns — never the request's loop, which may be closed before the render
        needs it. 400 names the offending scene/field; 501 when a sub-feature has no
        model (music.generate, timing=stt, TTS for narration) or ffmpeg is missing.
      - codai/compose/render.py: one normalised clip per visual (so a failed visual
        becomes a gradient and a warning instead of a lost render), concat or xfade
        that preserves the total duration, narration padded per scene and
        loudness-normalised, music looped/faded/ducked with sidechaincompress, burned
        captions + overlays with the final H.264 High/AAC/+faststart encode, thumbnail.
      - codai/compose/captions.py: word timings from STT aligned onto the CALLER's
        words (a mis-heard word never reaches the screen) or estimated; line breaking;
        ASS with six presets inside a 10%/6% safe area; SRT/VTT with the same text.
      - codai/compose/media.py: resolve a URL / /v1/files path / data URI / base64
        (never a server path), probe with ffprobe, resolve fonts through fontconfig.
      - codai/api/uploads.py: POST /v1/files/upload, content-addressed by sha256 with
        GET /v1/files/blob/{hash} so a client can skip a re-upload; type decided by
        content, not by the client's claim.
      - compose and uploads are pinned local in the capability gateway (a pod has
        ffmpeg but not this install's models or files); both advertised in the
        capability document; caption fonts (Montserrat/Inter/Noto CJK) added to the
        three image builds.
      - docs/video-compose.md; tests/test_compose.py (30, real ffmpeg, no model/GPU).
      Co-Authored-By: 's avatarClaude Opus 5 (1M context) <noreply@anthropic.com>
      Claude-Session: https://claude.ai/code/session_01B7EnDW6RSd2nhEPZMzMkqi
      5abbb81d
  2. 20 Sep, 2026 2 commits
    • Stefy Lanza (nextime / spora )'s avatar
    • Stefy Lanza (nextime / spora )'s avatar
      cluster: mDNS discovery with a shared token, prefix-cache routing, Prometheus... · 0d4a338b
      Stefy Lanza (nextime / spora ) authored
      cluster: mDNS discovery with a shared token, prefix-cache routing, Prometheus /metrics + per-key usage, node logs and re-push on return, GGUF row split, cosign-signed images
      
      - codai/cluster/discovery.py: _coderai._tcp announce + browse (zeroconf), HMAC
        fingerprint of cluster.token as membership; members auto-join as nodes,
        listed nodes with a blank key get the shared token; nodes and engines accept
        the cluster token (front /cluster/*, engine BearerAuth); env overrides for
        capability images (CODERAI_CLUSTER_TOKEN/DISCOVERY/NODE_NAME/ADVERTISE_HOST);
        coderai-docker --host-network
      - frontproxy/affinity.py + router prefer=: a conversation goes back to the
        engine/node that served it when the model is resident in several places;
        engine_for_model now picks the least busy holder
      - frontproxy/metrics.py: /metrics (requests per key/model/kind/status/engine,
        engines/nodes up, VRAM, in-flight, RPC, discovery, RunPod spend), usage
        tables on the Cluster page, server.metrics_public
      - node logs: /cluster/logs on the node, /admin/api/cluster/logs on the head,
        log viewer on the Cluster page; a node that comes back gets its assigned
        models pushed again
      - per-model split_mode=row (llama.cpp tensor parallel over local + RPC devices);
        vLLM TP may span nodes (documented)
      - packaging/sign-images.sh + packaging/cosign.pub: all 21 GHCR images signed
      - docs/cluster.md §§ discovery, 7 prefix routing, 9 operating, 10 accelerators
        evaluation; tests/test_cluster_ops.py (11)
      Co-Authored-By: 's avatarClaude Opus 5 (1M context) <noreply@anthropic.com>
      Claude-Session: https://claude.ai/code/session_01FKm7Z56iKjHgNkHc6VhWKz
      0d4a338b
  3. 19 Sep, 2026 17 commits
  4. 18 Sep, 2026 6 commits
  5. 17 Sep, 2026 7 commits
  6. 16 Sep, 2026 7 commits