feat: v2 rewrite — hexagonal arch, ActivityPub federation, NATS, deployment-ready #1

Merged
GKaszewski merged 334 commits from v2 into master 2026-05-16 09:42:43 +00:00
Owner

What this is

Complete ground-up rewrite of the thoughts backend + frontend wiring. Same domain, new architecture: hexagonal (ports & adapters), raw sqlx (no ORM), NATS for async events, full ActivityPub federation, two binaries (thoughts API + thoughts-worker).

Replaces the v1 Rust backend (SeaORM, no federation, tightly coupled persistence).


Architecture

domain              — pure types + port traits, zero external deps
application         — use cases + event processing services (business logic)
api-types           — shared REST DTOs (Serialize + utoipa schemas)
presentation        — Axum router, OpenAPI, HTTP-only
bootstrap           — binary: thoughts (API server, composition root)
worker              — binary: thoughts-worker (event consumer)
adapters/
  auth                 — JWT + Argon2
  postgres             — all domain repositories (raw sqlx)
  postgres-search      — trigram full-text search
  postgres-federation  — federation tables
  activitypub-base     — AP protocol, ActivityPubService, federation middleware
  activitypub          — project-specific AP wiring (inbox/outbox/actor)
  nats                 — NatsTransport + NatsMessageSource
  event-transport      — Transport + EventPublisherAdapter / MessageSource + EventConsumerAdapter
  event-payload        — shared event serialization DTOs

What's implemented

Core API

  • Auth: register, login (JWT Bearer)
  • Thoughts: create, read, update, delete, thread view
  • Social: follow/unfollow, like/unlike, boost/unboost, block/unblock
  • Feed: home feed, public feed, per-user timeline — all return full ThoughtResponse with author, counts, viewer flags
  • Search: full-text over thoughts and users (PostgreSQL trigram)
  • Tags: thoughts by tag with full enrichment, popular tags by usage count
  • Users: profile, search/list, count, follower-list, following-list
  • Notifications: list, mark read, mark all read
  • API keys: create, list, delete
  • Top friends: set, get
  • Health check

ActivityPub federation (Mastodon-compatible)

  • WebFinger, NodeInfo 2.0
  • Actor profile (/users/{username})
  • Inbox (Follow, Accept, Reject, Undo, Create, Delete, Update, Announce, Add, Block)
  • Outbox with pagination
  • Followers/following collections
  • Outbound fan-out via worker: ThoughtCreated → Create(Note), ThoughtDeleted → Delete, ThoughtUpdated → Update(Note), BoostAdded → Announce (deterministic ID), BoostRemoved → Undo(Announce) — delivered to accepted follower inboxes with deduplication (shared inbox), domain/actor blocking respected, 3x retry with exponential backoff
  • Visibility gate: only Public/Unlisted thoughts federate
  • Domain blocking, per-user actor blocking with Block activity delivery
  • Backfill on new follower accept

Events (NATS)

  • OutboundFederationPort + FederationEventService — AP fan-out
  • NotificationEventService — in-app notifications
  • Both wired as thin handler wrappers; business logic in application layer
  • Transport-agnostic: swap NATS for Kafka by implementing Transport

Infrastructure

  • OpenAPI at /docs (Swagger UI) + /scalar
  • Configurable: HOST, PORT, CORS_ORIGINS, ALLOW_REGISTRATION, RATE_LIMIT (tower-governor, per-minute, 429 on breach)
  • Migrations: 7 additive SQL files, run automatically at startup
  • Dockerfile (multi-stage, builds both binaries), deploy.sh (build amd64 + push to registry)
  • CI: lint (fmt + clippy), unit tests (no DB, 68 tests), integration tests (Postgres service)

Architecture cleanup (pre-merge)

Three hexagonal boundary violations fixed before merge:

  1. DB string conversions removed from domainfrom_db_str/as_str on FollowState, Visibility, NotificationType moved to private helpers in each postgres adapter
  2. follow_actor use case — local/remote routing decision lifted from presentation handler to application layer; tested with two unit tests
  3. public_key/private_key removed from User domain model — HTTP-signature key material belongs in the federation adapter only; also fixes a latent bug where UserRepository::save() would overwrite keys managed by the federation adapter

Test strategy

  • Unit tests (cargo test -p domain -p application …): 68 tests, zero DB, use TestStore in-memory fakes — run in CI without any service
  • Integration tests (cargo test -p postgres …): test actual SQL against a real Postgres instance

Deployment

Two-domain Traefik setup (nginx proxy removed):

  • thoughts.gabrielkaszewski.dev → frontend (Next.js, port 3000)
  • api.thoughts.gabrielkaszewski.dev → backend (Axum, port 8000)

NATS via external shared-services network (nats://k_nats:4222), same as movies-diary.

Key environment variables:

BASE_URL=https://api.thoughts.gabrielkaszewski.dev   # AP actor URLs live on the API domain
CORS_ORIGINS=https://thoughts.gabrielkaszewski.dev
ALLOW_REGISTRATION=false
RATE_LIMIT=60   # optional, requests/minute per IP

Data migration from v1: one-shot SQL script (kept off-repo — contains user data). Handles all table renames, column renames (author_id→user_id, reply_to_id→in_reply_to_id), visibility value mapping (friends_only→followers), and required new fields (local=true, state='accepted').


Breaking changes from v1

  • AUTH_SECRETJWT_SECRET
  • REST follower/following lists at /users/{username}/follower-list and /following-list (AP owns the original paths)

Known gaps

  • Remote unfollow not implemented — DELETE /users/{username}/follow returns 400 for remote handles. The underlying ActivityPubService::unfollow() method exists and is correct; it just isn't wired to the handler yet.
  • CORS is permissive by default (*) — set CORS_ORIGINS in production
## What this is Complete ground-up rewrite of the thoughts backend + frontend wiring. Same domain, new architecture: hexagonal (ports & adapters), raw sqlx (no ORM), NATS for async events, full ActivityPub federation, two binaries (`thoughts` API + `thoughts-worker`). Replaces the v1 Rust backend (SeaORM, no federation, tightly coupled persistence). --- ## Architecture ``` domain — pure types + port traits, zero external deps application — use cases + event processing services (business logic) api-types — shared REST DTOs (Serialize + utoipa schemas) presentation — Axum router, OpenAPI, HTTP-only bootstrap — binary: thoughts (API server, composition root) worker — binary: thoughts-worker (event consumer) adapters/ auth — JWT + Argon2 postgres — all domain repositories (raw sqlx) postgres-search — trigram full-text search postgres-federation — federation tables activitypub-base — AP protocol, ActivityPubService, federation middleware activitypub — project-specific AP wiring (inbox/outbox/actor) nats — NatsTransport + NatsMessageSource event-transport — Transport + EventPublisherAdapter / MessageSource + EventConsumerAdapter event-payload — shared event serialization DTOs ``` --- ## What's implemented **Core API** - Auth: register, login (JWT Bearer) - Thoughts: create, read, update, delete, thread view - Social: follow/unfollow, like/unlike, boost/unboost, block/unblock - Feed: home feed, public feed, per-user timeline — all return full `ThoughtResponse` with author, counts, viewer flags - Search: full-text over thoughts and users (PostgreSQL trigram) - Tags: thoughts by tag with full enrichment, popular tags by usage count - Users: profile, search/list, count, follower-list, following-list - Notifications: list, mark read, mark all read - API keys: create, list, delete - Top friends: set, get - Health check **ActivityPub federation (Mastodon-compatible)** - WebFinger, NodeInfo 2.0 - Actor profile (`/users/{username}`) - Inbox (Follow, Accept, Reject, Undo, Create, Delete, Update, Announce, Add, Block) - Outbox with pagination - Followers/following collections - Outbound fan-out via worker: `ThoughtCreated` → Create(Note), `ThoughtDeleted` → Delete, `ThoughtUpdated` → Update(Note), `BoostAdded` → Announce (deterministic ID), `BoostRemoved` → Undo(Announce) — delivered to accepted follower inboxes with deduplication (shared inbox), domain/actor blocking respected, 3x retry with exponential backoff - Visibility gate: only Public/Unlisted thoughts federate - Domain blocking, per-user actor blocking with Block activity delivery - Backfill on new follower accept **Events (NATS)** - `OutboundFederationPort` + `FederationEventService` — AP fan-out - `NotificationEventService` — in-app notifications - Both wired as thin handler wrappers; business logic in application layer - Transport-agnostic: swap NATS for Kafka by implementing `Transport` **Infrastructure** - OpenAPI at `/docs` (Swagger UI) + `/scalar` - Configurable: `HOST`, `PORT`, `CORS_ORIGINS`, `ALLOW_REGISTRATION`, `RATE_LIMIT` (tower-governor, per-minute, 429 on breach) - Migrations: 7 additive SQL files, run automatically at startup - Dockerfile (multi-stage, builds both binaries), `deploy.sh` (build amd64 + push to registry) - CI: lint (fmt + clippy), unit tests (no DB, 68 tests), integration tests (Postgres service) --- ## Architecture cleanup (pre-merge) Three hexagonal boundary violations fixed before merge: 1. **DB string conversions removed from domain** — `from_db_str`/`as_str` on `FollowState`, `Visibility`, `NotificationType` moved to private helpers in each postgres adapter 2. **`follow_actor` use case** — local/remote routing decision lifted from presentation handler to application layer; tested with two unit tests 3. **`public_key`/`private_key` removed from `User` domain model** — HTTP-signature key material belongs in the federation adapter only; also fixes a latent bug where `UserRepository::save()` would overwrite keys managed by the federation adapter --- ## Test strategy - **Unit tests** (`cargo test -p domain -p application …`): 68 tests, zero DB, use `TestStore` in-memory fakes — run in CI without any service - **Integration tests** (`cargo test -p postgres …`): test actual SQL against a real Postgres instance --- ## Deployment **Two-domain Traefik setup** (nginx proxy removed): - `thoughts.gabrielkaszewski.dev` → frontend (Next.js, port 3000) - `api.thoughts.gabrielkaszewski.dev` → backend (Axum, port 8000) **NATS** via external `shared-services` network (`nats://k_nats:4222`), same as movies-diary. **Key environment variables:** ``` BASE_URL=https://api.thoughts.gabrielkaszewski.dev # AP actor URLs live on the API domain CORS_ORIGINS=https://thoughts.gabrielkaszewski.dev ALLOW_REGISTRATION=false RATE_LIMIT=60 # optional, requests/minute per IP ``` **Data migration from v1:** one-shot SQL script (kept off-repo — contains user data). Handles all table renames, column renames (`author_id→user_id`, `reply_to_id→in_reply_to_id`), visibility value mapping (`friends_only→followers`), and required new fields (`local=true`, `state='accepted'`). --- ## Breaking changes from v1 - `AUTH_SECRET` → `JWT_SECRET` - REST follower/following lists at `/users/{username}/follower-list` and `/following-list` (AP owns the original paths) --- ## Known gaps - Remote unfollow not implemented — `DELETE /users/{username}/follow` returns 400 for remote handles. The underlying `ActivityPubService::unfollow()` method exists and is correct; it just isn't wired to the handler yet. - CORS is permissive by default (`*`) — set `CORS_ORIGINS` in production
GKaszewski added 20 commits 2026-05-14 02:12:08 +00:00
GKaszewski added 6 commits 2026-05-14 07:39:14 +00:00
GKaszewski added 6 commits 2026-05-14 08:01:22 +00:00
GKaszewski added 5 commits 2026-05-14 08:30:18 +00:00
GKaszewski changed title from feat: v2 backend rewrite — hexagonal architecture + full REST API to feat: v2 backend rewrite — hexagonal architecture, full-text search, NATS events, ActivityPub federation 2026-05-14 08:36:15 +00:00
GKaszewski added 5 commits 2026-05-14 09:00:42 +00:00
GKaszewski added 3 commits 2026-05-14 09:09:01 +00:00
GKaszewski added 3 commits 2026-05-14 09:22:09 +00:00
GKaszewski added 4 commits 2026-05-14 09:41:44 +00:00
GKaszewski added 3 commits 2026-05-14 10:08:04 +00:00
GKaszewski added 4 commits 2026-05-14 10:24:44 +00:00
GKaszewski added 5 commits 2026-05-14 10:37:49 +00:00
GKaszewski added 1 commit 2026-05-14 10:51:49 +00:00
GKaszewski added 14 commits 2026-05-14 13:07:53 +00:00
GKaszewski added 1 commit 2026-05-14 13:15:22 +00:00
chore: Dockerfile, README, LICENSE, .env.example, CI workflows (lint/test/deploy)
Some checks failed
lint / lint (push) Has been cancelled
test / test (push) Has been cancelled
lint / lint (pull_request) Failing after 5m3s
test / test (pull_request) Failing after 18m48s
057f10cb69
GKaszewski added 1 commit 2026-05-14 13:18:02 +00:00
ci(test): split into unit (no DB) and integration (postgres) jobs
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m9s
test / unit (pull_request) Successful in 15m59s
test / integration (pull_request) Failing after 16m59s
cf94b0ba6c
GKaszewski added 5 commits 2026-05-14 13:38:50 +00:00
feat(bootstrap): configurable HOST, CORS_ORIGINS, and optional rate limiting
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m3s
test / unit (pull_request) Successful in 16m6s
test / integration (pull_request) Failing after 17m45s
38b4774a63
GKaszewski added 1 commit 2026-05-14 13:43:37 +00:00
fix: tag feed returns full FeedEntry with author and counts
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m2s
test / unit (pull_request) Successful in 16m3s
test / integration (pull_request) Failing after 16m59s
cc9658975f
GKaszewski added 1 commit 2026-05-14 13:46:56 +00:00
chore: add deploy.sh — build amd64 image and push to registry
Some checks failed
lint / lint (push) Has been cancelled
test / integration (push) Has been cancelled
test / unit (push) Has been cancelled
lint / lint (pull_request) Failing after 5m4s
test / unit (pull_request) Successful in 16m39s
test / integration (pull_request) Failing after 16m56s
4890501512
GKaszewski changed title from feat: v2 backend rewrite — hexagonal architecture, full-text search, NATS events, ActivityPub federation to feat: v2 backend rewrite — hexagonal architecture, ActivityPub federation, NATS events 2026-05-14 13:49:09 +00:00
GKaszewski added 4 commits 2026-05-14 14:14:32 +00:00
GKaszewski added 1 commit 2026-05-14 14:20:40 +00:00
test(application): fill unit test gaps — api_keys, profile, auth, thoughts, social
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m7s
test / unit (pull_request) Successful in 16m2s
test / integration (pull_request) Failing after 16m57s
ddd9b17ed7
GKaszewski added 1 commit 2026-05-14 14:22:17 +00:00
chore: add compose.yml for local dev (postgres + nats)
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m9s
test / unit (pull_request) Successful in 16m14s
test / integration (pull_request) Failing after 17m3s
dd7beb7ab4
GKaszewski added 1 commit 2026-05-14 14:27:24 +00:00
refactor(application): fix 4 code smells — validate username input, extract ownership guard and dedup helpers
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m12s
test / unit (pull_request) Successful in 16m23s
test / integration (pull_request) Failing after 17m26s
e6f4a6256f
GKaszewski added 1 commit 2026-05-14 14:28:19 +00:00
feat: implement merge readiness plan to close gaps between v2 and v1
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m8s
test / unit (pull_request) Successful in 16m18s
test / integration (pull_request) Failing after 16m59s
004bfb427b
- Task 1: Fix feed response hydration by adding `to_thought_response` helper and updating feed handlers to return full `ThoughtResponse`.
- Task 2: Wire follower/following REST routes for user feeds.
- Task 3: Add user listing and count endpoints, including `GET /users` and `GET /users/count`.
- Task 4: Implement popular tags feature with `GET /tags/popular`.
- Task 5: Enhance configuration with HOST, CORS_ORIGINS, and optional rate limiting using tower-governor.
GKaszewski added 1 commit 2026-05-14 14:29:04 +00:00
Refactor handlers and OpenAPI documentation for improved readability and consistency
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 6m49s
test / unit (pull_request) Successful in 16m24s
test / integration (pull_request) Failing after 17m7s
10c4a66de5
- Reorganized imports in health, notifications, social, thoughts, and users handlers for clarity.
- Updated function signatures in handlers to improve readability by aligning parameters.
- Enhanced JSON response formatting in notifications and thoughts handlers.
- Improved error handling in user-related functions.
- Refactored OpenAPI documentation to maintain consistent formatting and structure.
- Cleaned up unnecessary code and comments across various files.
- Ensured consistent use of `Arc` for shared state in AppState and WorkerHandlers.
GKaszewski added 1 commit 2026-05-14 14:34:00 +00:00
fix: resolve all clippy warnings — redundant closures, dead code, collapsible_if, needless borrow
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m25s
test / unit (pull_request) Successful in 16m57s
test / integration (pull_request) Failing after 17m29s
550865bad4
GKaszewski added 1 commit 2026-05-14 14:41:55 +00:00
feat(nats): migrate to JetStream — at-least-once delivery with durable consumer
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m25s
test / unit (pull_request) Successful in 15m53s
test / integration (pull_request) Failing after 16m42s
458feebcdd
GKaszewski added 1 commit 2026-05-14 14:47:49 +00:00
fix(ap): add url field to Note, handle Delete(actor) and Tombstone objects
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m12s
test / unit (pull_request) Successful in 15m52s
test / integration (pull_request) Failing after 17m10s
d3b7ecad15
GKaszewski added 1 commit 2026-05-14 15:05:10 +00:00
feat: camelCase JSON responses, isFollowedByViewer, customCss, GET /users/me/following-list
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m15s
test / unit (pull_request) Successful in 16m3s
test / integration (pull_request) Failing after 17m19s
aadd876994
GKaszewski added 1 commit 2026-05-14 15:08:16 +00:00
fix: top-friends returns usernames not UUIDs
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m40s
test / unit (pull_request) Successful in 16m13s
test / integration (pull_request) Failing after 17m12s
7110f30e16
GKaszewski added 1 commit 2026-05-14 15:15:01 +00:00
feat: update frontend to work with v2 backend — camelCase, new endpoints, nested author
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m38s
test / unit (pull_request) Successful in 16m2s
test / integration (pull_request) Failing after 17m2s
44385adb6b
GKaszewski added 1 commit 2026-05-14 15:20:24 +00:00
fix(nats): use explicit subject prefixes — WorkQueue retention disallows > wildcard
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m9s
test / unit (pull_request) Successful in 16m19s
test / integration (pull_request) Failing after 17m5s
12adddaa16
GKaszewski added 1 commit 2026-05-14 15:28:42 +00:00
fix: await searchParams and params for Next.js 15 async API, compute totalPages in all-users page
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m41s
test / unit (pull_request) Successful in 16m33s
test / integration (pull_request) Failing after 17m3s
b95cebc799
GKaszewski added 1 commit 2026-05-14 15:32:41 +00:00
fix: per_page not perPage in Zod schemas — raw serde_json keys are snake_case
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m36s
test / unit (pull_request) Successful in 17m6s
test / integration (pull_request) Failing after 17m0s
7cb6b94b08
GKaszewski added 2 commits 2026-05-14 15:39:24 +00:00
fix: getUserProfile calls /users/{username}/profile to avoid AP route conflict
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m13s
test / unit (pull_request) Successful in 15m54s
test / integration (pull_request) Failing after 18m39s
c8c430fe7f
GKaszewski added 1 commit 2026-05-14 15:45:02 +00:00
fix(users): return camelCase from GET /users list — UserSummary was snake_case
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m34s
test / unit (pull_request) Successful in 16m5s
test / integration (pull_request) Failing after 18m6s
8ef3a300bc
GKaszewski added 2 commits 2026-05-14 15:47:17 +00:00
fix: include own thoughts in home feed
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m27s
test / unit (pull_request) Successful in 16m33s
test / integration (pull_request) Failing after 17m15s
68261c4b2b
GKaszewski added 1 commit 2026-05-14 15:49:26 +00:00
fix(thoughts): thought_to_json uses camelCase — POST/GET responses now match ThoughtSchema
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m33s
test / unit (pull_request) Successful in 16m22s
test / integration (pull_request) Failing after 17m18s
c67371231e
GKaszewski added 1 commit 2026-05-14 15:52:59 +00:00
fix: getThoughtThread parses flat array and builds nested tree — backend returns Vec not nested object
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m51s
test / unit (pull_request) Successful in 16m52s
test / integration (pull_request) Failing after 17m6s
255ff549a4
GKaszewski added 1 commit 2026-05-14 15:56:06 +00:00
fix(postgres): get_thread uses recursive CTE — fetches all nested replies not just direct ones
Some checks failed
lint / lint (push) Has been cancelled
test / integration (push) Has been cancelled
test / unit (push) Has been cancelled
lint / lint (pull_request) Failing after 9m18s
test / unit (pull_request) Successful in 16m9s
test / integration (pull_request) Failing after 17m5s
5c9acdecc1
GKaszewski added 1 commit 2026-05-14 16:01:12 +00:00
feat: extract and save hashtags on thought creation
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m18s
test / unit (pull_request) Successful in 16m4s
test / integration (pull_request) Failing after 17m16s
24bfda8458
GKaszewski added 1 commit 2026-05-14 16:03:19 +00:00
fix: follow/block handlers accept username string — was parsing as UUID
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m38s
test / unit (pull_request) Successful in 16m13s
test / integration (pull_request) Failing after 17m31s
171cfe4373
GKaszewski added 1 commit 2026-05-14 16:08:58 +00:00
fix: profile friends section shows profile owner's following list, not viewer's
Some checks failed
lint / lint (push) Has been cancelled
test / integration (push) Has been cancelled
test / unit (push) Has been cancelled
lint / lint (pull_request) Failing after 9m46s
test / unit (pull_request) Successful in 16m32s
test / integration (pull_request) Failing after 17m49s
e61e5b4cec
GKaszewski added 1 commit 2026-05-14 16:14:04 +00:00
fix: registration — parse AuthResponse correctly, auto-login after successful registration
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m38s
test / unit (pull_request) Successful in 16m14s
test / integration (pull_request) Failing after 17m16s
fcbd132a78
GKaszewski added 1 commit 2026-05-14 16:18:45 +00:00
fix: visibility-aware feeds — owner sees all, followers see followers-only, home feed includes non-public posts
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m44s
test / unit (pull_request) Successful in 16m12s
test / integration (pull_request) Failing after 16m59s
a5ea97bbaa
GKaszewski added 1 commit 2026-05-14 17:35:31 +00:00
fix(ap): visibility-aware addressing — correct to/cc outbound, parse inbound to/cc
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m25s
test / unit (pull_request) Successful in 16m39s
test / integration (pull_request) Failing after 17m35s
8602614e7c
GKaszewski added 11 commits 2026-05-14 18:26:10 +00:00
GKaszewski added 10 commits 2026-05-14 19:42:49 +00:00
GKaszewski added 1 commit 2026-05-14 19:46:03 +00:00
fix(activitypub-base): populate avatar_url, bio, banner from fetched actor JSON
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m46s
test / unit (pull_request) Failing after 11m36s
test / integration (pull_request) Failing after 17m47s
0c4df36b95
GKaszewski added 1 commit 2026-05-14 19:47:38 +00:00
fix(activitypub-base): populate also_known_as, profile_url, attachment from fetched actor
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 10m0s
test / unit (pull_request) Failing after 11m10s
test / integration (pull_request) Failing after 17m19s
ed6996e350
GKaszewski added 9 commits 2026-05-14 20:27:34 +00:00
GKaszewski added 1 commit 2026-05-14 20:29:39 +00:00
feat(frontend): link remote user card avatar/name to profile page
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m42s
test / unit (pull_request) Failing after 11m13s
test / integration (pull_request) Failing after 17m23s
a472ae08fb
GKaszewski added 1 commit 2026-05-14 20:31:02 +00:00
fix(frontend): remote user card link needs leading @ in handle URL
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m22s
test / unit (pull_request) Failing after 10m46s
test / integration (pull_request) Failing after 17m9s
72813d7c9b
GKaszewski added 1 commit 2026-05-14 20:36:27 +00:00
fix(frontend): encode handle in URL to avoid Next.js routing issues with @ chars
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m21s
test / unit (pull_request) Failing after 10m59s
test / integration (pull_request) Failing after 12s
4ce239fc87
GKaszewski added 1 commit 2026-05-14 20:40:26 +00:00
fix(frontend): middleware rewrites remote actor URLs to avoid Next.js file-extension routing issue
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 31s
test / unit (pull_request) Failing after 11m18s
test / integration (pull_request) Failing after 18m1s
072d06cb46
GKaszewski added 1 commit 2026-05-14 20:43:48 +00:00
fix: add federation.> to NATS stream subjects; update stream on startup; truncate long profile URLs
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m48s
test / unit (pull_request) Failing after 10m52s
test / integration (pull_request) Failing after 16m50s
df7fcf5096
GKaszewski added 1 commit 2026-05-14 20:45:09 +00:00
fix(frontend): truncate long handles in remote user profile and card
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m8s
test / unit (pull_request) Failing after 10m43s
test / integration (pull_request) Failing after 16m52s
f3df2061e1
GKaszewski added 1 commit 2026-05-14 20:47:44 +00:00
fix(frontend): profile fields table — overflow-x-auto, break-all values, styled links
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m12s
test / unit (pull_request) Failing after 11m0s
test / integration (pull_request) Failing after 17m17s
199fe91801
GKaszewski added 1 commit 2026-05-14 20:51:09 +00:00
fix(frontend): profile fields — grid layout caps name col at 5rem, value gets remaining space
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m22s
test / unit (pull_request) Failing after 11m23s
test / integration (pull_request) Failing after 17m2s
612b7f069b
GKaszewski added 1 commit 2026-05-14 20:59:17 +00:00
debug: add INFO logging to ensure_stream and remote_actor_posts_handler
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m42s
test / unit (pull_request) Failing after 10m52s
test / integration (pull_request) Failing after 17m20s
7bbc702e85
GKaszewski added 1 commit 2026-05-14 21:04:06 +00:00
fix(nats): switch from push to pull consumer — pull is reliable, push had deliver_subject issues
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m35s
test / unit (pull_request) Failing after 11m38s
test / integration (pull_request) Failing after 17m2s
17d2a186e1
GKaszewski added 1 commit 2026-05-14 21:07:09 +00:00
fix(nats): delete old push consumer before creating pull consumer
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m10s
test / unit (pull_request) Failing after 10m54s
test / integration (pull_request) Failing after 17m11s
9bda23f187
GKaszewski added 1 commit 2026-05-14 21:13:01 +00:00
chore: bump async-nats 0.38 → 0.48 to match movies-diary
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m15s
test / unit (pull_request) Failing after 11m16s
test / integration (pull_request) Failing after 17m40s
55c55424b5
GKaszewski added 1 commit 2026-05-14 21:18:00 +00:00
fix(nats): align with movies-diary — Limits retention, single wildcard subject, filter_subject on consumer, prefixed publish
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
0caca58c1c
GKaszewski added 1 commit 2026-05-14 21:19:43 +00:00
fix(nats): delete+recreate stream when retention policy is incompatible
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
40ed9b1ad8
GKaszewski added 1 commit 2026-05-14 21:25:07 +00:00
fix(nats): use fetch().expires(30s) instead of messages() — without expires NATS returns empty immediately
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
test / integration (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
lint / lint (pull_request) Has been cancelled
16892007a3
GKaszewski added 1 commit 2026-05-14 21:29:48 +00:00
fix(nats): remove filter_subject from consumer config
Some checks failed
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (push) Has been cancelled
lint / lint (pull_request) Failing after 9m20s
test / unit (pull_request) Failing after 10m40s
test / integration (pull_request) Failing after 17m47s
a4377fe209
GKaszewski added 1 commit 2026-05-14 21:34:53 +00:00
fix(nats): revert to consumer.messages() — fetch() defaults no_wait:true which skips empty queues
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m21s
test / unit (pull_request) Failing after 10m57s
test / integration (pull_request) Failing after 16m44s
4d2d56c8ae
GKaszewski added 1 commit 2026-05-14 21:53:39 +00:00
fix: truncate remote actor username to VARCHAR(32); fix outbox URL by following 'first' link
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m33s
test / unit (pull_request) Failing after 10m46s
test / integration (pull_request) Failing after 16m54s
fcfc1750fc
GKaszewski added 1 commit 2026-05-14 22:01:16 +00:00
fix(frontend): render bio HTML properly instead of as escaped text
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m24s
test / unit (pull_request) Failing after 12m17s
test / integration (pull_request) Failing after 17m10s
0b4c8c6c40
GKaszewski added 1 commit 2026-05-14 22:05:00 +00:00
feat: followers/following links on remote profile; render remote post content as HTML
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m39s
test / unit (pull_request) Failing after 10m48s
test / integration (pull_request) Failing after 16m54s
8b3dfffd3b
GKaszewski added 8 commits 2026-05-14 22:54:58 +00:00
GKaszewski added 1 commit 2026-05-14 23:04:48 +00:00
fix: remote actor display names in thought cards — use last URL segment as username, resolve display_name after intern
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m13s
test / unit (pull_request) Successful in 15m56s
test / integration (pull_request) Failing after 17m29s
e83b08fcc8
GKaszewski added 1 commit 2026-05-14 23:12:49 +00:00
feat: show media attachment notice for unsupported post types (photos/videos)
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m20s
test / unit (pull_request) Successful in 16m15s
test / integration (pull_request) Failing after 17m1s
83af9b2256
GKaszewski added 1 commit 2026-05-14 23:15:12 +00:00
fix: migrate thoughts.content VARCHAR(128) → TEXT to allow remote posts of any length
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m33s
test / unit (pull_request) Successful in 16m18s
test / integration (pull_request) Failing after 16m51s
e3251b6928
GKaszewski added 1 commit 2026-05-14 23:18:34 +00:00
fix: fetch_actor_urls_from_collection follows 'first' page link like outbox does
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
27e94d64b0
GKaszewski added 1 commit 2026-05-14 23:23:21 +00:00
docs: movies-diary first-class integration design notes
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
32161e777b
GKaszewski added 1 commit 2026-05-14 23:24:35 +00:00
chore: stop tracking .env (already in .gitignore)
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
0734ef20c6
GKaszewski added 2 commits 2026-05-14 23:26:26 +00:00
chore: update README, Dockerfile, compose.yml — add frontend/worker services, SSR env var, feature list
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
b2d6be90c2
GKaszewski added 1 commit 2026-05-14 23:27:09 +00:00
chore: deploy.sh builds and pushes both backend and frontend images
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
61c82d77ba
GKaszewski added 1 commit 2026-05-14 23:32:12 +00:00
chore: update compose.prod.yml (worker+nats external), CI builds frontend, deprecate thoughts-backend
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
e1bb7dde1f
GKaszewski added 1 commit 2026-05-14 23:33:45 +00:00
chore: deploy workflow is manual-only (workflow_dispatch)
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
71a0f55c93
GKaszewski added 1 commit 2026-05-14 23:39:03 +00:00
feat(frontend): rich OG metadata + dynamic page titles across all routes
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
a123c0b8cc
GKaszewski added 5 commits 2026-05-15 00:20:13 +00:00
GKaszewski changed title from feat: v2 backend rewrite — hexagonal architecture, ActivityPub federation, NATS events to feat: v2 rewrite — hexagonal arch, ActivityPub federation, NATS, deployment-ready 2026-05-15 00:28:07 +00:00
GKaszewski added 2 commits 2026-05-15 00:48:39 +00:00
fix: correct API_URL default value in deploy script
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
test / integration (pull_request) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
555bcea307
GKaszewski added 8 commits 2026-05-15 01:20:39 +00:00
GKaszewski added 19 commits 2026-05-15 02:45:14 +00:00
fix: full fediverse handle display + follower count includes remote
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2e3b81de17
GKaszewski added 28 commits 2026-05-15 09:52:57 +00:00
test(activitypub): add missing argument to test case for clarity
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m22s
test / unit (pull_request) Successful in 16m26s
test / integration (pull_request) Failing after 16m58s
5f61a71336
GKaszewski added 1 commit 2026-05-15 10:04:09 +00:00
feat: implement unread notification count and enhance user listing with pagination
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m33s
test / unit (pull_request) Successful in 16m24s
test / integration (pull_request) Failing after 16m52s
6273635aeb
GKaszewski added 1 commit 2026-05-15 10:08:52 +00:00
fix(service): remove unused followers and following route handlers
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m20s
test / unit (pull_request) Successful in 16m27s
test / integration (pull_request) Failing after 16m54s
a040a38036
GKaszewski added 1 commit 2026-05-15 10:31:32 +00:00
Refactor database error handling across repositories to use IntoDbResult for improved error management
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m30s
test / unit (pull_request) Successful in 16m10s
test / integration (pull_request) Failing after 16m44s
314dad5451
- Updated PgNotificationRepository to utilize IntoDbResult for error handling in various methods.
- Refactored PgRemoteActorRepository to replace manual error mapping with IntoDbResult.
- Modified PgRemoteActorConnectionRepository to implement IntoDbResult for error handling.
- Adjusted PgTagRepository to use IntoDbResult for consistent error management.
- Introduced test_helpers module for seeding users and thoughts in tests.
- Enhanced PgThoughtRepository to leverage IntoDbResult for error handling.
- Updated PgTopFriendRepository to utilize IntoDbResult for error management.
- Refactored PgUserRepository to implement IntoDbResult for error handling.
- Added constants for pagination defaults in requests.
- Introduced MAX_TOP_FRIENDS constant for top friends validation.
- Refactored JWT expiration time to use a constant.
- Improved rate limiter configuration with constants for better readability.
- Added utility methods for FollowState and Visibility enums for string conversions.
- Introduced maximum length constants for Username, Email, and Content value objects.
- Cleaned up test modules by removing redundant code and utilizing a shared testing state.
GKaszewski added 1 commit 2026-05-15 10:52:48 +00:00
fix(ap): protocol compliance — actor verification, on_unlike, Move, bto/bcc
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m31s
test / unit (pull_request) Successful in 16m12s
test / integration (pull_request) Failing after 16m53s
711b3ec63b
- Add verify() to Accept/Reject (actor must match Follow target)
- Add verify() to Create/Update (actor must match attributedTo)
- Add verify() to Delete (actor domain must match object domain)
- Fix UpdateActivity passing wrapper id instead of object id to on_update
- Implement on_unlike (was no-op stub) — publishes LikeRemoved event
- BlockActivity now removes remote actor as follower, not just following
- Add MoveActivity (account migration) to InboxActivities enum
- Add bto/bcc fields to CreateActivity for blind DM support
- http_signature_compat(true) restricted to debug mode only
- Announce of non-local object logs debug instead of silent drop
- postgres-federation: get_followers/get_following_page/count_following
  now consistently filter by status='accepted'
GKaszewski added 17 commits 2026-05-15 13:49:50 +00:00
fix(search): use to_thought_response in search handler — was returning snake_case partial data
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m24s
test / unit (pull_request) Successful in 16m42s
test / integration (pull_request) Failing after 17m1s
fd9e526b81
GKaszewski added 7 commits 2026-05-15 14:31:29 +00:00
GKaszewski added 3 commits 2026-05-15 16:55:52 +00:00
refactor: 5 architectural improvements (Tasks 2-5 + Task 6 fix)
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m2s
test / unit (pull_request) Successful in 16m19s
test / integration (pull_request) Failing after 17m15s
0592861edd
- feat(domain): Hashtag value object with canonical extract() — unifies two
  divergent private implementations; fields pre-compute raw/normalized/url_slug/ap_name

- feat(presentation): Deps<S: FromAppState> extractor — each handler now
  declares its exact dependency surface; AppState unchanged; handlers
  become unit-testable without mocking all 20 deps

- refactor(feed): replace 5 flat FeedRepository methods with FeedQuery/FeedScope
  — single query() method; SQL shared logic lives once; adding feed types
  no longer requires 5 edits

- refactor(activitypub): ActivityPubRepository + OutboundFederationPort moved
  out of domain::ports into activitypub-base::ap_ports — domain crate no
  longer knows about AP IDs, inboxes, or actor URLs

- fix(outbox): OutboxRelay now opens a per-row transaction so FOR UPDATE
  SKIP LOCKED actually holds the lock during publish + mark_delivered
GKaszewski added 1 commit 2026-05-15 16:58:28 +00:00
chore: remove arch-refactors subproject
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m0s
test / unit (pull_request) Successful in 16m19s
test / integration (pull_request) Failing after 17m4s
511a09db25
GKaszewski added 1 commit 2026-05-15 16:58:53 +00:00
clean up
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m2s
test / unit (pull_request) Successful in 16m56s
test / integration (pull_request) Failing after 17m15s
94ea7a287f
GKaszewski added 23 commits 2026-05-16 00:23:03 +00:00
- Tagged fetch cache: all GET fetches have next.tags for targeted invalidation
- Server Actions (thoughts, social, profile) replace scattered router.refresh()
- Eliminated author profile waterfall — use thought.author directly
- useOptimistic on FollowButton for instant feedback
- ThoughtForm unifies PostThoughtForm and ReplyForm
- EmptyState and LoadingSkeleton shared primitives
- RemoteUserProfile split into ProfileCard + Connections
feat: suspense boundaries, streaming sidebar, N+1 fix for top-friends
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m3s
test / unit (pull_request) Successful in 16m12s
test / integration (pull_request) Failing after 17m8s
78ee7b9388
- Backend: top-friends endpoint returns Vec<UserResponse> (JOIN already existed, handler was discarding data)
- Frontend: TopFriends self-contained — fetches own data via cookies, no more N+1 getUserProfile calls
- Frontend: sidebar (TopFriends, PopularTags, UsersCount) wrapped in Suspense — feed renders immediately
- Frontend: TagsSkeleton + CountSkeleton added to loading-skeleton.tsx
- Frontend: loading.tsx skeleton files added for feed, tags, search, and thread pages
GKaszewski added 7 commits 2026-05-16 00:56:54 +00:00
feat(activitypub): index hashtags from incoming federated notes
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m2s
test / unit (pull_request) Successful in 16m11s
test / integration (pull_request) Failing after 18m6s
65ec64a4d9
- accept_note now returns ThoughtId (INSERT then SELECT by ap_id)
- ThoughtsObjectHandler extracts Hashtag entries from AP tag array, strips #, lowercases
- Calls TagRepository.find_or_create + attach_to_thought for each tag; failures silenced
- TagRepository injected into handler via bootstrap and worker factories
GKaszewski added 16 commits 2026-05-16 09:37:44 +00:00
chore(application): fix unused import and clippy warnings in thoughts use cases
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m7s
test / unit (pull_request) Successful in 16m39s
test / integration (pull_request) Failing after 17m43s
2754e3e820
GKaszewski added 1 commit 2026-05-16 09:41:27 +00:00
clean up
Some checks failed
lint / lint (push) Failing after 5m1s
test / unit (push) Successful in 16m56s
test / integration (push) Failing after 19m2s
lint / lint (pull_request) Failing after 5m4s
test / unit (pull_request) Successful in 16m27s
test / integration (pull_request) Failing after 17m29s
0e76ca1895
GKaszewski merged commit 9aee4ceb6d into master 2026-05-16 09:42:43 +00:00
GKaszewski deleted branch v2 2026-05-16 09:42:43 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: GKaszewski/thoughts#1