Just another yet messenger
  • Rust 39.6%
  • TypeScript 37.4%
  • Typst 8.9%
  • JavaScript 7.4%
  • Python 5.3%
  • Other 1.3%
Find a file
kiper220 a982e0a6da
Some checks failed
Nightly Delivery / spec-check (push) Successful in 14s
Nightly Delivery / nightly (push) Failing after 1m40s
feat(web): migrate all API calls to GwClient, remove MLS/events JS layer
Replace every direct server call (with accessToken/signer parameters)
in the web layer with delegating calls through GwClient (Rust WASM).
Remove the TypeScript MLS engine, sync policies, events.ts and
conversation-feed-sync entirely — this logic now lives in Rust.

Key changes:
- New chat-actions.ts: thin getGwClient() accessor used by all features
- Removed accessToken/signer from all API functions in chat-api.ts,
  contact-api.ts, search-api.ts, security-api.ts, voice-api.ts,
  key-vault.ts and use-media-object-url.ts
- Removed accessToken props from MessageArea, MessageAttachments,
  MemberSidebar, UserProfilePopup, CommandPalette widgets and
  app-shell.tsx
- Deleted: mls-engine.ts, mls-store.ts, mls-sync-policy.ts,
  mls-readiness.test.ts, mls-sync-policy.test.ts,
  mls-test-diagnostics.ts, topology-convergence.ts,
  conversation-feed-sync.ts/.test.ts, events.ts,
  events.audio.test.ts, events.markdown-regression.test.ts
- Updated client-core.ts TypeScript bindings to expose GwClient interface
- Updated contact-api.test.ts to mock GwClient instead of the removed
  pure-JS signing path

All 55 unit tests pass, TypeScript compiles with zero errors.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 02:11:41 +04:00
.forgejo/workflows Migrate crypto to Rust/WASM and decompose oversized service modules 2026-03-28 23:38:01 +04:00
branding chore: initial commit with structured spec and russian mermaid diagrams 2026-02-24 01:58:37 +04:00
client-rust chore: snapshot current guildwine workspace 2026-03-22 19:02:03 +04:00
crates feat(wasm): add high-level GwClient struct with full protocol pipeline 2026-04-01 02:11:25 +04:00
scripts Migrate crypto to Rust/WASM and decompose oversized service modules 2026-03-28 23:38:01 +04:00
spec Migrate crypto to Rust/WASM and decompose oversized service modules 2026-03-28 23:38:01 +04:00
web feat(web): migrate all API calls to GwClient, remove MLS/events JS layer 2026-04-01 02:11:41 +04:00
.dockerignore chore: snapshot current guildwine workspace 2026-03-22 19:02:03 +04:00
.gitignore chore: snapshot current guildwine workspace 2026-03-22 19:02:03 +04:00
AGENTS.MD Stabilize MLS topology convergence and feed diagnostics 2026-03-26 18:58:02 +04:00
Cargo.lock feat(wasm): add high-level GwClient struct with full protocol pipeline 2026-04-01 02:11:25 +04:00
Cargo.toml feat(wasm): add high-level GwClient struct with full protocol pipeline 2026-04-01 02:11:25 +04:00
CLAUDE.md Migrate crypto to Rust/WASM and decompose oversized service modules 2026-03-28 23:38:01 +04:00
docker-compose.yml chore: snapshot current guildwine workspace 2026-03-22 19:02:03 +04:00
INSTALL.MD chore: snapshot current guildwine workspace 2026-03-22 19:02:03 +04:00
Makefile chore: snapshot current guildwine workspace 2026-03-22 19:02:03 +04:00
README.MD chore: snapshot current guildwine workspace 2026-03-22 19:02:03 +04:00

GuildWine

GuildWine is a federated messenger with a Rust backend, a React web client, and supporting shared crates for protocol, canonical signing, and MLS-related client logic.

Components

  • crates/gw_server: HTTP/API server and federation endpoints.
  • web: React/Vite frontend source. Production delivery uses built static assets, not vite dev.
  • scripts/package-backend.sh: builds and packs the backend runtime payload.
  • scripts/package-web.sh: builds and packs the production frontend dist.
  • .forgejo/workflows: nightly and tag-based delivery pipelines.

Local Development

Docker Compose

docker compose up --build

This uses the dev Dockerfiles:

  • crates/gw_server/Dockerfile.dev
  • web/Dockerfile.dev

Services:

  • web: http://localhost:3000
  • backend: http://localhost:8080

Without Docker

Backend:

cargo run -p guildwine --bin guildwine

Frontend:

npm --prefix web ci
VITE_PROXY_TARGET=http://127.0.0.1:8080 npm --prefix web run dev -- --host 0.0.0.0 --port 3000

Packaging

Backend package:

bash scripts/package-backend.sh v0.1.0

Creates:

  • dist/artifacts/guildwine-backend-v0.1.0-linux-amd64.tar.gz
  • dist/artifacts/guildwine-backend-linux-amd64.tar.gz

Web package:

npm --prefix web ci
bash scripts/package-web.sh v0.1.0

Creates:

  • dist/artifacts/guildwine-web-v0.1.0-dist.tar.gz
  • dist/artifacts/guildwine-web-dist.tar.gz

Production Docker images are built from these packaged artifacts. They do not rebuild the project inside the image.

Production Docker Images

  • Backend image build source: crates/gw_server/Dockerfile
  • Web image build source: web/Dockerfile

Backend image contents:

  • all release binaries from crates/gw_server

Web image contents:

  • prebuilt static frontend from web/dist
  • static-only nginx runtime on port 3000

The production web image does not proxy /v1 or /.well-known. That routing must be handled by your ingress or reverse proxy.

Forgejo Delivery

Nightly

Pushes to main trigger .forgejo/workflows/nightly.yaml.

Outputs:

  • workflow artifacts with backend/web packaged archives
  • Docker images:
    • git.wetgrape.su/wetgrape/guildwine-backend:nightly-main
    • git.wetgrape.su/wetgrape/guildwine-backend:nightly-<shortsha>
    • git.wetgrape.su/wetgrape/guildwine-web:nightly-main
    • git.wetgrape.su/wetgrape/guildwine-web:nightly-<shortsha>

Releases

Git tags trigger .forgejo/workflows/release.yaml.

Outputs:

  • Forgejo Release with packaged backend/web tarballs as assets
  • Docker images tagged with the git tag
  • latest only for stable tags

Auth For Publishing

Recommended repository secrets:

  • FORGEJO_PUBLISH_USER
  • FORGEJO_PUBLISH_TOKEN

The workflows require these dedicated credentials for registry publication. Use a token that is allowed to create releases and publish container packages on the Forgejo instance.

Tag Naming

Stable release tags:

  • v1.2.3

Prerelease tags:

  • v1.2.3-alpha.1
  • v1.2.3-beta.1
  • v1.2.3-rc.1
  • v1.2.3-pre.1
  • any other SemVer-compatible prerelease suffix after -

Rules:

  • Only strict vMAJOR.MINOR.PATCH tags are treated as stable.
  • Any SemVer tag with a prerelease suffix is treated as prerelease.
  • Prerelease tags publish release assets and versioned Docker images, but do not update latest.
  • Stable tags publish release assets, versioned Docker images, and update latest.
  • Nightly delivery is created only from main and does not use git tags.

Pulling Images

Examples:

docker pull git.wetgrape.su/wetgrape/guildwine-backend:nightly-main
docker pull git.wetgrape.su/wetgrape/guildwine-web:nightly-main
docker pull git.wetgrape.su/wetgrape/guildwine-backend:v1.2.3
docker pull git.wetgrape.su/wetgrape/guildwine-web:v1.2.3

Stable latest:

docker pull git.wetgrape.su/wetgrape/guildwine-backend:latest
docker pull git.wetgrape.su/wetgrape/guildwine-web:latest

Notes

  • INSTALL.MD contains the domain and reverse-proxy setup guide.
  • The repository currently targets linux/amd64 for packaged artifacts and Docker delivery.