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

334 Commits

Author SHA1 Message Date
0e76ca1895 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
2026-05-16 11:41:24 +02:00
2754e3e820 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
2026-05-16 11:31:07 +02:00
4b1e7565ac feat(bootstrap): wire ApiKeyServiceImpl + PgEngagementRepository 2026-05-16 11:21:19 +02:00
5618da7d37 refactor(presentation): replace impl FromAppState boilerplate with deps_struct! macro in remaining handlers 2026-05-16 11:19:04 +02:00
e9f7851400 refactor(presentation/feed): call ports directly — remove shallow use case wrappers 2026-05-16 11:16:57 +02:00
d701a40e61 feat(presentation/thoughts): use enrichment use cases — real engagement stats, no hardcoded zeros 2026-05-16 11:16:54 +02:00
eea1d3fe24 feat(presentation): add deps_struct! macro; add api_key_auth + engagement to AppState; use ApiKeyService in extractor 2026-05-16 11:10:45 +02:00
90866aea58 refactor(application): delete shallow feed use cases — keep only get_home_feed 2026-05-16 11:09:26 +02:00
2d2b5dde6a feat(application): add get_thought_view + get_thread_views use cases with real engagement stats 2026-05-16 11:08:31 +02:00
bf5fd618cb feat(postgres): add PgEngagementRepository with batch stats query 2026-05-16 11:04:54 +02:00
ae8a3dc6ed feat(postgres): add list_paginated + find_by_ids to PgUserRepository 2026-05-16 11:04:33 +02:00
0222a168db feat(auth): add ApiKeyServiceImpl — moves sha256 hashing out of presentation 2026-05-16 11:03:07 +02:00
d3223923e4 feat(domain/testing): add ApiKeyService, EngagementRepository, list_paginated, find_by_ids to TestStore 2026-05-16 11:01:54 +02:00
f4db518167 feat(domain): add ApiKeyService, EngagementRepository ports; extend UserReader with list_paginated + find_by_ids 2026-05-16 10:59:32 +02:00
8628acfb77 refactor(application): use UniqueViolation in register — remove postgres constraint strings 2026-05-16 10:58:14 +02:00
1ab3766ce8 fix(postgres): map unique constraint violations to DomainError::UniqueViolation 2026-05-16 10:57:04 +02:00
ca35e8e774 feat(domain): add DomainError::UniqueViolation {field} 2026-05-16 10:55:58 +02:00
65ec64a4d9 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
- 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
2026-05-16 02:56:07 +02:00
efa9bbc6e5 feat(bootstrap): inject TagRepository into ThoughtsObjectHandler 2026-05-16 02:52:58 +02:00
3907ee1538 feat(activitypub): index hashtags from incoming federated notes 2026-05-16 02:51:09 +02:00
98e96b306a fix(postgres): accept_note returns ThoughtId via SELECT after INSERT 2026-05-16 02:48:52 +02:00
0d43d0adb9 refactor(ap-ports): accept_note returns ThoughtId instead of () 2026-05-16 02:46:20 +02:00
1d35cedf3f docs: federated hashtag indexing implementation plan 2026-05-16 02:43:39 +02:00
f895503175 docs: federated hashtag indexing design spec 2026-05-16 02:39:33 +02:00
78ee7b9388 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
- 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
2026-05-16 02:18:51 +02:00
f135e4d583 feat(frontend): loading.tsx skeletons for feed, tags, search, and thread pages 2026-05-16 02:16:45 +02:00
42baf3fe3c perf(frontend): stream sidebar via Suspense — feed renders immediately; sidebar loads async 2026-05-16 02:14:36 +02:00
e86f07ef34 refactor(frontend): TopFriends self-contained — fetches own data, no N+1 2026-05-16 02:11:05 +02:00
98d3fdb832 feat(frontend): TagsSkeleton and CountSkeleton for sidebar Suspense fallbacks 2026-05-16 02:10:55 +02:00
2c3e7934b8 fix(frontend): getTopFriends schema returns UserSchema[] not string[] 2026-05-16 02:10:37 +02:00
29e4af26d8 fix(api): top-friends endpoint returns full UserResponse — eliminates frontend N+1 2026-05-16 02:08:22 +02:00
57b1bfc447 feat(api-types): TopFriendsResponse with Vec<UserResponse> 2026-05-16 02:06:06 +02:00
28521cc9ed docs: suspense + streaming implementation plan 2026-05-16 02:03:52 +02:00
7f10349c76 docs: suspense + streaming design spec 2026-05-16 01:59:16 +02:00
e2210ba0f0 feat(frontend): performance + DRY + composition overhaul
- 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
2026-05-15 23:21:51 +02:00
448cd506eb fix(frontend): remove dead activeTab state; guard URL hostname parse 2026-05-15 20:21:05 +02:00
c1c9539978 refactor(frontend): split RemoteUserProfile into ProfileCard + Connections 2026-05-15 20:16:39 +02:00
688e7b0018 refactor(frontend): FollowButton useOptimistic + Server Action; edit-profile-form Server Action 2026-05-15 20:08:49 +02:00
71233f069e fix(frontend): ThoughtForm — safe onSuccess?.() on cancel, dedupe reply textarea classes 2026-05-15 20:07:27 +02:00
d450a1d8d8 refactor(frontend): EmptyState + LoadingSkeleton primitives; unified ThoughtForm replaces PostThoughtForm and ReplyForm 2026-05-15 20:01:00 +02:00
dadfe04934 perf(frontend): eliminate author profile waterfall — use thought.author directly 2026-05-15 19:47:06 +02:00
9ecbde019d feat(frontend): Server Actions for thought, social, and profile mutations 2026-05-15 19:43:10 +02:00
ed789c6170 fix(frontend): tag remaining GET fetches for cache invalidation 2026-05-15 19:41:50 +02:00
091c3a4706 feat(frontend): add next.tags cache support to apiFetch; tag all GET fetches 2026-05-15 19:38:24 +02:00
fe610c8b6f fix(frontend): tag getTopFriends fetch 2026-05-15 19:30:17 +02:00
4f92c16c0f docs: frontend overhaul implementation plan 2026-05-15 19:24:28 +02:00
896d2d86c9 docs: frontend overhaul design spec 2026-05-15 19:17:31 +02:00
94ea7a287f 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
2026-05-15 18:58:45 +02:00
511a09db25 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
2026-05-15 18:58:24 +02:00
0592861edd 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
- 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
2026-05-15 18:54:20 +02:00
6024a65060 feat(infra): transactional outbox — OutboxWriter port, PgOutboxWriter, OutboxRelay, TestOutbox; update create_thought + delete_thought 2026-05-15 18:31:57 +02:00
15b1d0fdb7 fix(db): map 23505 unique_violation to DomainError::Conflict (→ HTTP 409); close TOCTOU on register save 2026-05-15 17:03:48 +02:00
a02ae3e662 fix(db): in_reply_to_id FK ON DELETE SET NULL — deleting a thought no longer blocks if it has replies
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 16m10s
test / integration (pull_request) Failing after 17m4s
2026-05-15 16:29:57 +02:00
e43d784c39 feat(worker): DLQ processor — exhausted events moved to failed_events with exponential retry 2026-05-15 16:26:44 +02:00
c092b9e658 feat(postgres): failed_events table and PgFailedEventStore for dead-letter queue 2026-05-15 16:23:21 +02:00
340886fcfe fix(nats): explicit consumer config, ack timeouts, unknown-event acking, delivery_count 2026-05-15 16:20:31 +02:00
75e8d349e3 fix(auth): validate JWT secret length, equalize login timing, reduce TTL to 24h 2026-05-15 16:16:58 +02:00
50a08d8ed6 docs: NATS hardening + DLQ + auth security implementation plan 2026-05-15 16:15:10 +02:00
e278e4e2cc docs: NATS hardening, DLQ, and auth security design spec 2026-05-15 16:10:11 +02:00
fd9e526b81 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
2026-05-15 15:44:59 +02:00
6dd4e3366c fix(search): viewer-aware SQL in search_thoughts — ViewerContext now real instead of hardcoded false 2026-05-15 15:24:55 +02:00
48b57abf92 refactor(adapters): update FeedEntry construction to use EngagementStats + ViewerContext 2026-05-15 15:21:48 +02:00
686dc1c91a refactor(domain): FeedEntry — EngagementStats + Option<ViewerContext> sub-structs 2026-05-15 15:20:07 +02:00
693f53b4b6 docs: FeedEntry decoupling implementation plan 2026-05-15 15:18:32 +02:00
a245b7b8b9 docs: FeedEntry decoupling design spec 2026-05-15 15:15:33 +02:00
988f5c75aa fix(tests): use distinct usernames in notification tests 2026-05-15 14:11:58 +02:00
3f6b91c943 refactor(ports): ActivityPubRepository takes &str instead of url::Url — infra type stays in adapter 2026-05-15 14:06:33 +02:00
c76894e527 refactor(domain): remove AP delivery fields (inbox_url, public_key) from domain RemoteActor 2026-05-15 14:02:53 +02:00
1a77e15d70 refactor(application): remove pass-through search use cases — call SearchPort directly 2026-05-15 13:59:30 +02:00
f697267828 fix(domain): from_db_str returns Result — unknown DB values are errors not silent defaults 2026-05-15 13:57:38 +02:00
5a64dd361c refactor(domain): algebraic NotificationKind — invalid states now unrepresentable 2026-05-15 13:53:53 +02:00
189901b778 refactor(ports): CQRS split — FederationActionPort into four focused sub-ports 2026-05-15 13:49:58 +02:00
8ed7f3d5bc refactor(ports): CQRS split — UserRepository = UserReader + UserWriter supertrait 2026-05-15 13:43:43 +02:00
a902154777 refactor(domain): remove FetchRemoteActorPosts/FetchActorConnections from DomainEvent; add FederationSchedulerPort 2026-05-15 13:28:19 +02:00
e935c8973e refactor(domain): remove ap_id/inbox_url from User and Thought; use ActivityPubRepository lookups 2026-05-15 13:21:21 +02:00
bf3e336d0f feat(ports): add get_thought_ap_id and get_actor_ap_urls to ActivityPubRepository 2026-05-15 13:09:37 +02:00
711b3ec63b 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
- 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'
2026-05-15 12:52:37 +02:00
314dad5451 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
- 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.
2026-05-15 12:31:25 +02:00
a040a38036 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
2026-05-15 12:08:45 +02:00
6273635aeb 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
2026-05-15 12:04:00 +02:00
5f61a71336 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
2026-05-15 11:52:49 +02:00
7b1e26fa9e fix(ap): propagate sharedInbox through DbActor — was hardcoded None everywhere 2026-05-15 11:51:57 +02:00
bd1dd89f78 refactor(bootstrap): use ap_service.router() as single source of truth for AP routes 2026-05-15 11:47:37 +02:00
a8caca8df8 fix(bootstrap): register /inbox shared inbox route — was missing, Mastodon delivers deletes there 2026-05-15 11:45:46 +02:00
296dfdaeee fix(frontend): key RemoteUserProfile and Tabs by actor/user id to reset state on navigation 2026-05-15 11:26:17 +02:00
db1625dc0d fix(ap): use Note id (not Create activity id) in CreateActivity::receive — fixes Delete sync 2026-05-15 10:58:13 +02:00
4b20bfd369 fix(frontend): initialize follow state from server-side following list on remote actor profile 2026-05-15 10:54:01 +02:00
cf78b3e28f fix(frontend): use thought.author.avatarUrl as base in ThoughtThread — fixes remote author avatars on feed and detail pages 2026-05-15 10:46:38 +02:00
159a8ca43b fix(ap): store avatar_url from fetched actor in remote_actors when following 2026-05-15 10:27:26 +02:00
cf6eec55da fix(feed): append @domain to handle when remote_actors stored username-only handle (old data) 2026-05-15 10:17:13 +02:00
44e152783f fix(feed): join remote_actors to get proper handle and avatar for remote authors 2026-05-15 10:09:14 +02:00
2a51241bb5 fix(ap): resolve parent ap_id for replies so inReplyTo is set on outbound Notes 2026-05-15 09:59:50 +02:00
009b2d43c9 feat(frontend): show external parent link on remote reply posts 2026-05-15 05:51:03 +02:00
f946239757 feat(api): expose replyToUrl in ThoughtResponse for remote reply context 2026-05-15 05:50:59 +02:00
90dbf76753 feat(feed): include remote following posts in home feed 2026-05-15 05:47:26 +02:00
6c83c193ed feat(ap): @mention notification from inbound remote Notes 2026-05-15 05:44:10 +02:00
ca1ebc4b68 feat(ap): broadcast Update(Actor) when user updates their profile 2026-05-15 05:32:25 +02:00
d360e506db feat(ap): handle Undo(Like) inbound activity 2026-05-15 05:28:52 +02:00
f008564c32 feat(ap): add hashtag tag array to outbound Notes 2026-05-15 05:26:56 +02:00
82f2a3aaa0 fix(ap): wrap outbound Note content in HTML paragraph tags 2026-05-15 05:25:20 +02:00
3455512bbb docs: federation gaps round 2 implementation plan 2026-05-15 05:23:37 +02:00
09bebf7dc9 fix: store in_reply_to on remote notes + use full handle in federation component links/actions 2026-05-15 05:09:44 +02:00
e04b08c202 feat(application): federate local likes + locality guard prevents remote boost re-broadcast 2026-05-15 04:58:38 +02:00
a7527c50be feat(activitypub): implement on_like and on_announce_received in ThoughtsObjectHandler 2026-05-15 04:55:50 +02:00
e691b20a05 feat(activitypub-base): broadcast_like/undo_like + LikeActivity inbox handler 2026-05-15 04:52:03 +02:00
0cf34184d9 feat(activitypub-base): LikeActivity struct + on_like/on_announce_received trait methods 2026-05-15 04:49:20 +02:00
6d365dd3cf feat(domain): add broadcast_like/broadcast_undo_like to OutboundFederationPort 2026-05-15 04:47:19 +02:00
9af1d33e71 docs: AP likes and boost notifications implementation plan 2026-05-15 04:45:39 +02:00
2e3b81de17 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
2026-05-15 04:35:04 +02:00
4342a06319 clean up 2026-05-15 04:29:18 +02:00
d88eb5d127 feat(frontend): show @handle and link to profile in federation actor lists 2026-05-15 04:28:36 +02:00
d98c338e52 fix(frontend): unify local+remote followers/following — profile tab becomes Requests only 2026-05-15 04:25:33 +02:00
895b892cf2 feat(frontend): proper pagination with page numbers and ellipsis 2026-05-15 04:21:11 +02:00
40d8234225 fix(frontend): hide pagination when only one page 2026-05-15 04:19:45 +02:00
9df1a55c48 feat(frontend): federation tab on own profile 2026-05-15 04:14:56 +02:00
cb413ee6e9 feat(frontend): federation settings page 2026-05-15 04:14:29 +02:00
b86c486530 feat(frontend): FederationPanel tabbed wrapper 2026-05-15 04:14:07 +02:00
86a21a5bb7 feat(frontend): RemoteFollowing component 2026-05-15 04:13:51 +02:00
c4dd0797a1 feat(frontend): RemoteFollowers component 2026-05-15 04:13:34 +02:00
497edf3437 feat(frontend): PendingRequests component 2026-05-15 04:13:17 +02:00
e4d1a1f4d1 feat(frontend): federation management API client functions 2026-05-15 04:12:52 +02:00
a8fbfcf49e feat(presentation): federation management endpoints 2026-05-15 04:10:36 +02:00
8c6e259133 feat(application): federation management use cases 2026-05-15 04:08:40 +02:00
75c1870891 feat(activitypub-base): implement federation management port methods 2026-05-15 04:05:31 +02:00
1b0bb911a0 feat(domain): add federation management methods to FederationActionPort 2026-05-15 03:35:58 +02:00
3903421d54 docs: federation management implementation plan 2026-05-15 03:33:39 +02:00
4533e35092 docs: federation management design spec 2026-05-15 03:28:01 +02:00
f7ac6f6476 feat(dependencies): add bcrypt, blowfish, cipher, and inout packages to Cargo.lock
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
2026-05-15 03:20:37 +02:00
9976c1481a feat(frontend): show precise date on hover over relative timestamps 2026-05-15 03:19:24 +02:00
e6b351b472 feat(frontend): show fediverse handle @user@domain on local user profiles 2026-05-15 03:16:17 +02:00
706d7389ed refactor: replace inline find_by_id calls with get_user use case in presentation handlers 2026-05-15 03:14:09 +02:00
6e9b1596d8 refactor: move UUID/username routing to application use case — fix handler boundary leak 2026-05-15 03:12:52 +02:00
bbf6c97379 fix: UUID fallback in GET /users/{id} so AP actor URLs resolve for signature verification 2026-05-15 03:11:33 +02:00
b5427cab7d fix: force HTTPS for WebFinger in follow/unfollow — library uses HTTP in debug mode 2026-05-15 03:03:51 +02:00
f7350847c5 fix: allow dots in usernames; BCrypt fallback in password verifier for v1 migrations 2026-05-15 02:56:18 +02:00
555bcea307 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
2026-05-15 02:48:36 +02:00
031a22514d feat: implement remote unfollow — wire FederationActionPort through delete_follow handler 2026-05-15 02:46:24 +02:00
eebdbeaaf2 chore: use shared-services network for NATS, hardcode URL to match homeserver
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
2026-05-15 02:15:07 +02:00
f387be43fb chore: replace nginx proxy with direct Traefik routing on two domains 2026-05-15 02:13:32 +02:00
1a1ba3da63 refactor(domain): remove public_key/private_key from User model — managed by federation adapter 2026-05-15 02:06:06 +02:00
9757ebdabf refactor(application): move local/remote follow routing out of presentation handler 2026-05-15 01:58:40 +02:00
344bcf34af refactor(domain): move DB string conversions out of domain enums 2026-05-15 01:54:32 +02:00
a123c0b8cc 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
2026-05-15 01:38:59 +02:00
71a0f55c93 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
2026-05-15 01:33:41 +02:00
e1bb7dde1f 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
2026-05-15 01:32:09 +02:00
61c82d77ba 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
2026-05-15 01:27:06 +02:00
b2d6be90c2 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
2026-05-15 01:26:23 +02:00
4cd94b3c7f clean up 2026-05-15 01:25:16 +02:00
0734ef20c6 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
2026-05-15 01:24:32 +02:00
32161e777b 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
2026-05-15 01:23:18 +02:00
27e94d64b0 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
2026-05-15 01:18:28 +02:00
e3251b6928 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
2026-05-15 01:15:09 +02:00
83af9b2256 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
2026-05-15 01:12:44 +02:00
e83b08fcc8 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
2026-05-15 01:04:42 +02:00
3c6344f954 feat(frontend): followers/following tabs on remote actor profile with lazy loading + 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 9m16s
test / unit (pull_request) Successful in 16m12s
test / integration (pull_request) Failing after 16m54s
2026-05-15 00:51:37 +02:00
c536cc2cd4 feat(presentation): followers/following list endpoints for remote actors 2026-05-15 00:48:42 +02:00
38a13ad641 feat(worker): handle FetchActorConnections — resolve and cache remote actor connections 2026-05-15 00:40:34 +02:00
58126f195c feat(activitypub-base): impl fetch_actor_urls_from_collection + resolve_actor_profiles (concurrent, 5s timeout) 2026-05-15 00:33:14 +02:00
d62dde67bb feat(postgres): remote_actor_connections table + PgRemoteActorConnectionRepository 2026-05-15 00:29:33 +02:00
99dd89b60d feat(domain): ActorConnectionSummary, ConnectionType, RemoteActorConnectionRepository, FetchActorConnections event 2026-05-15 00:25:54 +02:00
23501f5203 docs: remote actor connections implementation plan 2026-05-15 00:22:03 +02:00
75f59a1f40 docs: remote actor connections (followers/following) design spec 2026-05-15 00:17:21 +02:00
8b3dfffd3b 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
2026-05-15 00:04:54 +02:00
0b4c8c6c40 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
2026-05-15 00:01:13 +02:00
fcfc1750fc 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
2026-05-14 23:53:33 +02:00
4d2d56c8ae 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
2026-05-14 23:34:51 +02:00
a4377fe209 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
2026-05-14 23:29:45 +02:00
16892007a3 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
2026-05-14 23:25:01 +02:00
40ed9b1ad8 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
2026-05-14 23:19:41 +02:00
0caca58c1c 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
2026-05-14 23:17:57 +02:00
55c55424b5 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
2026-05-14 23:12:53 +02:00
9bda23f187 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
2026-05-14 23:07:05 +02:00
17d2a186e1 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
2026-05-14 23:04:03 +02:00
7bbc702e85 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
2026-05-14 22:59:12 +02:00
612b7f069b 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
2026-05-14 22:51:07 +02:00
199fe91801 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
2026-05-14 22:47:42 +02:00
f3df2061e1 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
2026-05-14 22:45:06 +02:00
df7fcf5096 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
2026-05-14 22:43:43 +02:00
072d06cb46 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
2026-05-14 22:40:21 +02:00
4ce239fc87 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
2026-05-14 22:36:24 +02:00
72813d7c9b 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
2026-05-14 22:30:59 +02:00
a472ae08fb 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
2026-05-14 22:29:35 +02:00
8ef7c93970 feat(frontend): remote actor profile page with bio, fields, and 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 10m5s
test / unit (pull_request) Failing after 10m51s
test / integration (pull_request) Failing after 17m1s
2026-05-14 22:25:53 +02:00
dc3afeca26 feat(worker): handle FetchRemoteActorPosts — fetch and store remote outbox notes 2026-05-14 22:23:20 +02:00
f3c3637ade feat(presentation): remote actor posts endpoint + extended RemoteActorResponse 2026-05-14 22:19:23 +02:00
00b369c6ad feat(bootstrap): add ap_repo to AppState 2026-05-14 22:16:20 +02:00
8c931c9b98 feat(event-payload): add FetchRemoteActorPosts to uniqueness test 2026-05-14 22:15:33 +02:00
1ddb6a3954 feat(activitypub-base): impl fetch_outbox_page; populate all RemoteActor fields in lookup_actor 2026-05-14 22:13:39 +02:00
70fc4fbcd0 feat(domain): RemoteActor fields, RemoteNote, FetchRemoteActorPosts event, fetch_outbox_page port 2026-05-14 22:08:26 +02:00
cbfaeb95ac docs: remote actor profile implementation plan 2026-05-14 22:04:11 +02:00
2e64e196b5 docs: remote actor profile design spec 2026-05-14 21:58:09 +02:00
ed6996e350 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
2026-05-14 21:47:34 +02:00
0c4df36b95 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
2026-05-14 21:45:55 +02:00
908789e639 fix: content negotiation for followers/following — resolve AP router 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 9m28s
test / unit (pull_request) Failing after 11m39s
test / integration (pull_request) Failing after 17m5s
2026-05-14 21:42:38 +02:00
fc3b4146a5 refactor(frontend): update API client to match cleaned REST routes 2026-05-14 21:34:26 +02:00
e64404cf40 refactor(routes): clean RESTful route table; content negotiation at /users/{username} 2026-05-14 21:31:02 +02:00
fbc02bc2f8 refactor(social): unified follow handler; remove federation handler module 2026-05-14 21:28:33 +02:00
d1f72c8308 refactor(users): content negotiation at GET /users/{username}; move lookup_handler; rename get_me_following 2026-05-14 21:25:49 +02:00
abc5f2b936 refactor(api): notification state changes use PATCH with JSON body 2026-05-14 21:05:30 +02:00
d5a116e483 feat(activitypub-base): impl actor_json port; return full user@domain handle from lookup 2026-05-14 20:47:41 +02:00
57110f3b75 feat(domain): add actor_json to FederationActionPort 2026-05-14 20:46:10 +02:00
812cf7b140 docs: REST API cleanup implementation plan 2026-05-14 20:44:31 +02:00
93967e53a2 docs: REST API cleanup design spec 2026-05-14 20:38:05 +02:00
dbd891d60d fix(activitypub-base): lookup_actor fetches WebFinger via HTTPS directly
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 16m33s
test / integration (pull_request) Failing after 17m33s
2026-05-14 20:25:14 +02:00
baf8b57b6d fix(activitypub-base): strip leading @ from handle before WebFinger lookup 2026-05-14 20:16:00 +02:00
a7a331858d feat(frontend): remote actor lookup and follow from search page 2026-05-14 20:09:49 +02:00
31487882e0 feat(presentation): /federation/lookup and /federation/follow endpoints 2026-05-14 20:06:55 +02:00
a08bb3d698 feat(bootstrap): wire ActivityPubService as FederationActionPort in AppState 2026-05-14 20:03:49 +02:00
1d50b54227 fix(activitypub-base): use username as display_name in lookup_actor 2026-05-14 20:02:01 +02:00
fce819be7f feat(activitypub-base): impl FederationActionPort for ActivityPubService 2026-05-14 19:59:19 +02:00
0e45707d7e fix(postgres): persist and read avatar_url in remote_actor adapter 2026-05-14 19:57:13 +02:00
82f8772104 feat(domain): FederationActionPort trait + avatar_url on RemoteActor 2026-05-14 19:55:10 +02:00
8eb59bfac6 docs: remote actor search & follow implementation plan 2026-05-14 19:52:29 +02:00
62970d519a docs: remote actor search & follow spec 2026-05-14 19:48:34 +02:00
8602614e7c 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
2026-05-14 19:34:43 +02:00
a5ea97bbaa 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
2026-05-14 18:18:42 +02:00
fcbd132a78 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
2026-05-14 18:13:57 +02:00
e61e5b4cec 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
2026-05-14 18:08:50 +02:00
171cfe4373 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
2026-05-14 18:03:16 +02:00
24bfda8458 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
2026-05-14 18:01:07 +02:00
5c9acdecc1 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
2026-05-14 17:56:03 +02:00
255ff549a4 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
2026-05-14 17:52:52 +02:00
c67371231e 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
2026-05-14 17:49:22 +02:00
68261c4b2b 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
2026-05-14 17:47:13 +02:00
057ed3ccbf fix: joinedAt nullable in UserSchema, guard null in profile page 2026-05-14 17:45:01 +02:00
8ef3a300bc 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
2026-05-14 17:44:59 +02:00
c8c430fe7f 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
2026-05-14 17:39:20 +02:00
ec0e24db8d fix: add GET /users/{username}/profile REST endpoint — AP actor owns /users/{username} 2026-05-14 17:39:19 +02:00
7cb6b94b08 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
2026-05-14 17:32:39 +02:00
b95cebc799 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
2026-05-14 17:28:35 +02:00
12adddaa16 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
2026-05-14 17:20:21 +02:00
44385adb6b 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
2026-05-14 17:14:27 +02:00
7110f30e16 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
2026-05-14 17:08:12 +02:00
aadd876994 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
2026-05-14 17:04:42 +02:00
d3b7ecad15 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
2026-05-14 16:47:17 +02:00
458feebcdd 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
2026-05-14 16:41:17 +02:00
550865bad4 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
2026-05-14 16:33:34 +02:00
10c4a66de5 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
- 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.
2026-05-14 16:28:57 +02:00
004bfb427b 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
- 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.
2026-05-14 16:28:18 +02:00
e6f4a6256f 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
2026-05-14 16:27:03 +02:00
dd7beb7ab4 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
2026-05-14 16:22:16 +02:00
ddd9b17ed7 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
2026-05-14 16:19:35 +02:00
d50c13a2db refactor: wrap direct port calls behind use cases — notifications, search, popular_tags
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 15m51s
test / integration (pull_request) Failing after 17m3s
2026-05-14 16:13:34 +02:00
004f3cd4d2 fix(arch): move AP router assembly to bootstrap — presentation no longer depends on activitypub-base 2026-05-14 16:09:21 +02:00
970f5a1644 fix: move user_feed to FeedRepository — proper counts and viewer flags for user timelines 2026-05-14 16:06:38 +02:00
ecba9267cf fix: compute liked_by_viewer/boosted_by_viewer from DB — viewer_id was ignored in all feed queries 2026-05-14 16:03:55 +02:00
4890501512 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
2026-05-14 15:46:53 +02:00
cc9658975f 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
2026-05-14 15:43:02 +02:00
38b4774a63 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
2026-05-14 15:37:38 +02:00
9b47779e63 feat: GET /tags/popular — top tags by usage count 2026-05-14 15:34:40 +02:00
eb7dbb0aee feat: GET /users (search/list) and GET /users/count 2026-05-14 15:34:37 +02:00
a2cc4fba21 feat(presentation): wire GET /users/{username}/follower-list and /following-list 2026-05-14 15:34:33 +02:00
6eba91e699 fix(presentation): hydrate feed responses with full ThoughtResponse — remove UUID-only stubs 2026-05-14 15:31:44 +02:00
cf94b0ba6c 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
2026-05-14 15:17:59 +02:00
057f10cb69 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
2026-05-14 15:15:18 +02:00
ed744046f4 refactor(activitypub-base): eliminate double get_local_actor — extract thought_note_json, remove dead broadcast_to_followers methods 2026-05-14 14:36:54 +02:00
931894d77a refactor(activitypub-base): extract accepted_follower_inboxes helper — eliminate 7x duplicated filtering 2026-05-14 14:23:38 +02:00
2485869af6 fix(activitypub-base): deterministic announce IDs so Undo(Announce) can reference original activity 2026-05-14 14:16:48 +02:00
b0b3c6a59b feat: BoostRemoved → Undo(Announce) fan-out via OutboundFederationPort 2026-05-14 14:10:11 +02:00
eaf079069f fix(application): gate federation broadcast on Public/Unlisted visibility only 2026-05-14 14:03:31 +02:00
a37c877172 chore(worker): remove stale dependencies after business logic migration 2026-05-14 13:59:45 +02:00
904916d4c1 refactor(worker): thin handlers + factory — move all business logic to application services 2026-05-14 13:57:14 +02:00
057fc29abc fix(activitypub-base): validate update Note id URL, add updated field to Update Notes 2026-05-14 13:50:05 +02:00
1fa8389a69 feat(activitypub-base): Announce broadcast + impl OutboundFederationPort for ActivityPubService 2026-05-14 13:46:31 +02:00
83e87e644b test(application): document user-not-found silent-skip and locality guard in FederationEventService 2026-05-14 13:44:13 +02:00
13282fc88e feat(application): FederationEventService — content fan-out business logic 2026-05-14 13:40:10 +02:00
10605bbf2f test(application): add self_boost_creates_no_notification test 2026-05-14 13:37:29 +02:00
2d742bdbe3 feat(application): NotificationEventService — move notification business logic out of worker 2026-05-14 13:35:20 +02:00
925856f6b8 feat(domain): OutboundFederationPort — thin AP broadcast abstraction 2026-05-14 13:32:23 +02:00
114d9f9558 fix(activitypub): re-export NoteType from activitypub-base, drop direct activitypub_federation dep 2026-05-14 12:51:47 +02:00
69b55058ce feat(worker): use EventConsumerAdapter<NatsMessageSource> — transport-agnostic consuming 2026-05-14 12:37:16 +02:00
e995b29be1 refactor(nats): replace NatsEventConsumer with NatsMessageSource implementing MessageSource 2026-05-14 12:36:45 +02:00
c202eded05 feat(event-transport): MessageSource trait + EventConsumerAdapter for transport-agnostic consuming 2026-05-14 12:34:45 +02:00
f9ca5836fb refactor: rename event-publisher → event-transport 2026-05-14 12:30:58 +02:00
7963278189 docs: event-transport rename + consumer abstraction plan 2026-05-14 12:29:28 +02:00
ff82764eb0 feat(bootstrap): wire EventPublisherAdapter<NatsTransport> — transport-agnostic event publishing 2026-05-14 12:24:15 +02:00
cfc8c19175 refactor(nats): strip NatsEventPublisher, add NatsTransport implementing Transport 2026-05-14 12:22:11 +02:00
a684c922e0 feat(event-publisher): Transport trait + EventPublisherAdapter for transport-agnostic event routing 2026-05-14 12:20:29 +02:00
42d3dbd251 docs: event-publisher transport abstraction plan 2026-05-14 12:18:41 +02:00
c072ee95cd refactor(presentation): pure HTTP library — remove concrete adapter deps and binary 2026-05-14 12:07:18 +02:00
0c7a6fe9be feat(bootstrap): composition root with Config + factory.rs 2026-05-14 12:05:00 +02:00
53185efe5e docs: bootstrap factory implementation plan 2026-05-14 12:00:20 +02:00
1866eef770 feat(presentation): OpenAPI docs at /docs (Swagger) and /scalar 2026-05-14 11:41:12 +02:00
137d1a0c6a feat(presentation): add utoipa::path annotations to all handlers 2026-05-14 11:34:02 +02:00
4f990afe5e feat(api-types): add utoipa ToSchema and IntoParams derives 2026-05-14 11:30:11 +02:00
fb8c75af72 docs: OpenAPI documentation implementation plan 2026-05-14 11:27:43 +02:00
2524440fe4 feat(presentation): GET /health endpoint 2026-05-14 11:21:58 +02:00
6082766935 feat(presentation): GET /users/me, GET /users/{username}/thoughts, GET /tags/{name} 2026-05-14 11:20:48 +02:00
e408a53136 docs: v1 parity gaps implementation plan 2026-05-14 11:19:29 +02:00
68fe8624cd feat(worker): Reply notification when ThoughtCreated has in_reply_to_id 2026-05-14 11:08:30 +02:00
1127a5946f feat: UserUnblocked + UserRegistered events, fix unblock_user and register signatures 2026-05-14 11:06:36 +02:00
f0b87311e3 docs: audit gap fixes implementation plan 2026-05-14 11:03:36 +02:00
ea14035062 fix: wire PgActivityPubRepository into ThoughtsObjectHandler — closes activitypub→postgres violation 2026-05-14 10:59:43 +02:00
4ae3af8086 refactor(activitypub): ThoughtsObjectHandler uses ActivityPubRepository port, drops postgres dep 2026-05-14 10:58:25 +02:00
e0b0a71f1d feat(postgres): PgActivityPubRepository implementing ActivityPubRepository port 2026-05-14 10:55:58 +02:00
5f8e96b9be feat(domain): ActivityPubRepository port with federation vocabulary 2026-05-14 10:52:35 +02:00
54bd1c193b docs: ActivityPubRepository port implementation plan 2026-05-14 10:50:06 +02:00
e0a27c99a4 feat(presentation): ActivityPub routes — WebFinger, NodeInfo, inbox, outbox 2026-05-14 10:28:22 +02:00
2080fec347 feat(activitypub): ThoughtNote AP object and ThoughtsObjectHandler 2026-05-14 10:23:35 +02:00
21b6a04f97 feat(postgres-federation): FederationRepository and ApUserRepository 2026-05-14 10:19:57 +02:00
ebc612a311 feat(activitypub-base): copy from movies-diary with username-based actor URLs 2026-05-14 10:15:34 +02:00
c9b389a00c docs: v2 Plan 4 federation implementation plan 2026-05-14 10:10:36 +02:00
3318635da6 feat(presentation): NatsEventPublisher with no-op fallback when NATS_URL unset 2026-05-14 10:00:39 +02:00
2e702c64cc feat(worker): consumer loop binary connecting NATS to handlers 2026-05-14 09:58:33 +02:00
2cee884fe1 feat(worker): NotificationHandler and FederationHandler stub 2026-05-14 09:58:31 +02:00
a0893b1c69 feat(nats): NatsEventPublisher and NatsEventConsumer with payload conversion 2026-05-14 09:54:50 +02:00
57232705fe feat(event-payload): serializable NATS event payload types 2026-05-14 09:48:58 +02:00
02de6b6f83 docs: v2 Plan 3 events+worker implementation plan 2026-05-14 09:45:57 +02:00
b599047d98 feat(presentation): wire SearchPort, /search returns thoughts + users 2026-05-14 09:38:02 +02:00
4eeaea2a14 feat(postgres): upgrade FeedRepository search from ILIKE to pg_trgm 2026-05-14 09:28:02 +02:00
ebf0aaab58 feat(postgres-search): PgSearchRepository using pg_trgm 2026-05-14 09:26:36 +02:00
a3534317de feat(domain): SearchPort trait with thought and user search 2026-05-14 09:23:22 +02:00
6e5d0de636 feat(postgres): pg_trgm extension and GIN search indexes 2026-05-14 09:21:59 +02:00
bfe6db2215 docs: v2 Plan 2 search implementation plan 2026-05-14 09:19:52 +02:00
f75e796faf fix: align follow event with accepted state; redact internal error details 2026-05-14 04:10:27 +02:00
c5d262c68f feat(presentation): routes and main — Plan 1 complete 2026-05-14 04:06:17 +02:00
38106ecdb6 feat(presentation): all handlers 2026-05-14 04:00:04 +02:00
fb39ea2469 feat(presentation): state, errors, extractors, auth and user handlers 2026-05-14 03:56:42 +02:00
adc2102927 feat(application): all use cases 2026-05-14 03:52:36 +02:00
134ecdcfb4 feat(api-types): request and response DTOs 2026-05-14 03:48:16 +02:00
2b428b2b0a feat(auth): JWT AuthService and Argon2 PasswordHasher 2026-05-14 03:47:08 +02:00
69608cfc75 feat(postgres): Tag, ApiKey, TopFriend, Notification, RemoteActor, Feed repos 2026-05-14 03:45:11 +02:00
02ce3a49b4 feat(postgres): LikeRepository, BoostRepository 2026-05-14 03:40:15 +02:00
1dab9ffbfb feat(postgres): FollowRepository, BlockRepository 2026-05-14 03:38:20 +02:00
9dd04541ac feat(postgres): ThoughtRepository 2026-05-14 03:35:39 +02:00
fe9655ee96 feat(postgres): UserRepository 2026-05-14 03:32:56 +02:00
62ee73e302 feat(postgres): initial migrations 2026-05-14 03:26:42 +02:00
80b656341d feat(domain): ports, events, test helpers 2026-05-14 03:23:42 +02:00
4b8d1027c1 feat(domain): models 2026-05-14 03:18:49 +02:00
94a3f414e4 feat(domain): errors and value objects 2026-05-14 03:16:22 +02:00
63a7001165 chore: scaffold v2 workspace 2026-05-14 03:07:45 +02:00
321571aae9 docs: v2 Plan 1 implementation plan (core) 2026-05-14 03:03:02 +02:00
9d6e3298f1 docs: clarify presentation layer is REST-only 2026-05-14 01:09:07 +02:00
6fd9a76e68 docs: v2 architecture rewrite design spec 2026-05-14 01:08:13 +02:00