# yourikka/feed architecture

> Architecture diagram of the GitHub repository yourikka/feed, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/yourikka/feed
- Repository: https://github.com/yourikka/feed

## Overview

Feed Flow is a short-video social application. The main journey is a viewer choosing a latest, hot, or follow feed; the frontend fetches IDs and then details, displays videos, and reports playback behavior. Users can also register, publish videos, interact with content, and manage profiles and relationships. The backend separates HTTP handling from feed, interaction, and user services, with Redis-backed ranking/caches and asynchronous RabbitMQ workers. The README documents several feed capabilities whose implementation details were not sampled; those are represented at the service or ranking level without inferring internal call sequences.

Main entry points: [`feed-flow-backend/router/router.go`](https://github.com/yourikka/feed/blob/main/feed-flow-backend/router/router.go) (API router), [`feed-flow-backend/main.go`](https://github.com/yourikka/feed/blob/main/feed-flow-backend/main.go) (Worker startup), [`feed-flow-backend/ranking/hot.go`](https://github.com/yourikka/feed/blob/main/feed-flow-backend/ranking/hot.go) (Hot ranking), [`feed-flow-frontend/src/App.vue`](https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/App.vue) (Vue application)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web client"]
  node_app["Vue application<br/>[App.vue]"]
  node_feedview["Feed view<br/>[Feed.vue]"]
  node_feedapi["Feed API client<br/>[feed.js]"]
  node_userpages["User views<br/>[Profile.vue]"]
  node_publishview["Publish view<br/>[Publish.vue]"]
  node_interactionapi["Interaction API<br/>[interaction.js]"]
  node_userapi["User API<br/>[user.js]"]
end

subgraph group_http["HTTP API"]
  node_router["API router<br/>[router.go]"]
  node_feedctrl["Feed handlers<br/>[feed.go]"]
  node_userctrl["User handlers<br/>[user.go]"]
  node_interactctrl["Interaction handlers<br/>[interaction.go]"]
end

subgraph group_feed["Feed and ranking"]
  node_feedservice["Feed service<br/>[feed.go]"]
  node_ranking["Hot ranking<br/>[hot.go]"]
  node_snapshot["Ranking snapshots<br/>[snapshot.go]"]
end

subgraph group_social["Users and interactions"]
  node_userservice["User service<br/>[user.go]"]
  node_interactionservice["Interaction service<br/>[interaction.go]"]
  node_behaviorservice["Behavior service<br/>[behavior.go]"]
end

subgraph group_async["Async processing"]
  node_main["Worker startup<br/>[main.go]"]
  node_videomq["Video publish consumer<br/>[video_mq.go]"]
  node_outbox["Outbox publisher<br/>[outbox.go]"]
  node_behaviorworker["Behavior worker<br/>[behavior_async.go]"]
  node_interactionworker["Interaction worker"]
end

node_viewer(("Viewer"))
node_mysql[("MySQL")]
node_redis[("Redis")]
node_rabbit["RabbitMQ"]

node_viewer -->|"uses"| node_app
node_app -->|"routes to"| node_feedview
node_feedview -->|"requests feed"| node_feedapi
node_feedview -->|"sends actions"| node_interactionapi
node_app -->|"routes to"| node_userpages
node_app -->|"routes to"| node_publishview
node_userpages -->|"requests profile"| node_userapi
node_publishview -->|"submits publish"| node_userapi
node_feedapi -->|"HTTP requests"| node_router
node_interactionapi -->|"HTTP requests"| node_router
node_userapi -->|"HTTP requests"| node_router
node_router -->|"dispatches feed"| node_feedctrl
node_router -->|"dispatches users"| node_userctrl
node_router -->|"dispatches actions"| node_interactctrl
node_feedctrl -->|"calls feed logic"| node_feedservice
node_userctrl -->|"calls user logic"| node_userservice
node_interactctrl -->|"calls interaction logic"| node_interactionservice
node_feedservice -->|"reads feed data"| node_mysql
node_feedservice -->|"reads and caches"| node_redis
node_feedservice -->|"gets hot IDs"| node_ranking
node_ranking -->|"stores ranking"| node_redis
node_ranking -->|"builds cursors"| node_snapshot
node_userservice -->|"reads and writes"| node_mysql
node_interactionservice -->|"reads and writes"| node_mysql
node_interactionservice -.->|"publishes events"| node_rabbit
node_feedctrl -->|"records behavior"| node_behaviorservice
node_behaviorservice -.->|"publishes events"| node_rabbit
node_main -->|"starts consumer"| node_videomq
node_main -->|"starts publisher"| node_outbox
node_main -->|"starts worker"| node_behaviorworker
node_main -->|"starts worker"| node_interactionworker
node_main -->|"starts refresh"| node_ranking
node_videomq -->|"consumes publish queue"| node_rabbit
node_videomq -->|"records publish score"| node_ranking
node_outbox -->|"reads pending events"| node_mysql
node_outbox -->|"publishes messages"| node_rabbit
node_behaviorworker -->|"consumes events"| node_rabbit
node_behaviorworker -->|"processes behavior"| node_behaviorservice
node_interactionworker -->|"consumes events"| node_rabbit
node_interactionworker -->|"processes actions"| node_interactionservice

click node_app "https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/App.vue"
click node_feedview "https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/views/Feed.vue"
click node_feedapi "https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/api/feed.js"
click node_userpages "https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/views/Profile.vue"
click node_publishview "https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/views/Publish.vue"
click node_interactionapi "https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/api/interaction.js"
click node_userapi "https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/api/user.js"
click node_router "https://github.com/yourikka/feed/blob/main/feed-flow-backend/router/router.go"
click node_feedctrl "https://github.com/yourikka/feed/blob/main/feed-flow-backend/controller/feed.go"
click node_userctrl "https://github.com/yourikka/feed/blob/main/feed-flow-backend/controller/user.go"
click node_interactctrl "https://github.com/yourikka/feed/blob/main/feed-flow-backend/controller/interaction.go"
click node_feedservice "https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/feed.go"
click node_ranking "https://github.com/yourikka/feed/blob/main/feed-flow-backend/ranking/hot.go"
click node_snapshot "https://github.com/yourikka/feed/blob/main/feed-flow-backend/ranking/snapshot.go"
click node_userservice "https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/user.go"
click node_interactionservice "https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/interaction.go"
click node_behaviorservice "https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/behavior.go"
click node_main "https://github.com/yourikka/feed/blob/main/feed-flow-backend/main.go"
click node_videomq "https://github.com/yourikka/feed/blob/main/feed-flow-backend/mq/video_mq.go"
click node_outbox "https://github.com/yourikka/feed/blob/main/feed-flow-backend/mq/outbox.go"
click node_behaviorworker "https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/behavior_async.go"
click node_interactionworker "https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/interaction_async.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_feedview,node_feedapi,node_userpages,node_publishview,node_interactionapi,node_userapi,node_viewer toneBlue
class node_router,node_feedctrl,node_userctrl,node_interactctrl,node_mysql,node_redis toneAmber
class node_feedservice,node_ranking,node_snapshot toneMint
class node_userservice,node_interactionservice,node_behaviorservice toneRose
class node_main,node_videomq,node_outbox,node_behaviorworker,node_interactionworker,node_rabbit toneIndigo
```

## Components

### Web client

- [Vue application](https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/App.vue): `feed-flow-frontend/src/App.vue`
- [Feed view](https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/views/Feed.vue): `feed-flow-frontend/src/views/Feed.vue`
- [Feed API client](https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/api/feed.js): `feed-flow-frontend/src/api/feed.js`
- [User views](https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/views/Profile.vue): `feed-flow-frontend/src/views/Profile.vue`
- [Publish view](https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/views/Publish.vue): `feed-flow-frontend/src/views/Publish.vue`
- [Interaction API](https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/api/interaction.js): `feed-flow-frontend/src/api/interaction.js`
- [User API](https://github.com/yourikka/feed/blob/main/feed-flow-frontend/src/api/user.js): `feed-flow-frontend/src/api/user.js`

### HTTP API

- [API router](https://github.com/yourikka/feed/blob/main/feed-flow-backend/router/router.go): `feed-flow-backend/router/router.go`
- [Feed handlers](https://github.com/yourikka/feed/blob/main/feed-flow-backend/controller/feed.go): `feed-flow-backend/controller/feed.go`
- [User handlers](https://github.com/yourikka/feed/blob/main/feed-flow-backend/controller/user.go): `feed-flow-backend/controller/user.go`
- [Interaction handlers](https://github.com/yourikka/feed/blob/main/feed-flow-backend/controller/interaction.go): `feed-flow-backend/controller/interaction.go`

### Feed and ranking

- [Feed service](https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/feed.go): `feed-flow-backend/service/feed.go`
- [Hot ranking](https://github.com/yourikka/feed/blob/main/feed-flow-backend/ranking/hot.go): `feed-flow-backend/ranking/hot.go`
- [Ranking snapshots](https://github.com/yourikka/feed/blob/main/feed-flow-backend/ranking/snapshot.go): `feed-flow-backend/ranking/snapshot.go`

### Users and interactions

- [User service](https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/user.go): `feed-flow-backend/service/user.go`
- [Interaction service](https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/interaction.go): `feed-flow-backend/service/interaction.go`
- [Behavior service](https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/behavior.go): `feed-flow-backend/service/behavior.go`

### Async processing

- [Worker startup](https://github.com/yourikka/feed/blob/main/feed-flow-backend/main.go): `feed-flow-backend/main.go`
- [Video publish consumer](https://github.com/yourikka/feed/blob/main/feed-flow-backend/mq/video_mq.go): `feed-flow-backend/mq/video_mq.go`
- [Outbox publisher](https://github.com/yourikka/feed/blob/main/feed-flow-backend/mq/outbox.go): `feed-flow-backend/mq/outbox.go`
- [Behavior worker](https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/behavior_async.go): `feed-flow-backend/service/behavior_async.go`
- [Interaction worker](https://github.com/yourikka/feed/blob/main/feed-flow-backend/service/interaction_async.go): `feed-flow-backend/service/interaction_async.go`

### Other components

- **Viewer**
- **MySQL**
- **Redis**
- **RabbitMQ**

## Connections

- Viewer → Vue application: uses
- Vue application → Feed view: routes to
- Feed view → Feed API client: requests feed
- Feed view → Interaction API: sends actions
- Vue application → User views: routes to
- Vue application → Publish view: routes to
- User views → User API: requests profile
- Publish view → User API: submits publish
- Feed API client → API router: HTTP requests
- Interaction API → API router: HTTP requests
- User API → API router: HTTP requests
- API router → Feed handlers: dispatches feed
- API router → User handlers: dispatches users
- API router → Interaction handlers: dispatches actions
- Feed handlers → Feed service: calls feed logic
- User handlers → User service: calls user logic
- Interaction handlers → Interaction service: calls interaction logic
- Feed service → MySQL: reads feed data
- Feed service → Redis: reads and caches
- Feed service → Hot ranking: gets hot IDs
- Hot ranking → Redis: stores ranking
- Hot ranking → Ranking snapshots: builds cursors
- User service → MySQL: reads and writes
- Interaction service → MySQL: reads and writes
- Interaction service → RabbitMQ: publishes events
- Feed handlers → Behavior service: records behavior
- Behavior service → RabbitMQ: publishes events
- Worker startup → Video publish consumer: starts consumer
- Worker startup → Outbox publisher: starts publisher
- Worker startup → Behavior worker: starts worker
- Worker startup → Interaction worker: starts worker
- Worker startup → Hot ranking: starts refresh
- Video publish consumer → RabbitMQ: consumes publish queue
- Video publish consumer → Hot ranking: records publish score
- Outbox publisher → MySQL: reads pending events
- Outbox publisher → RabbitMQ: publishes messages
- Behavior worker → RabbitMQ: consumes events
- Behavior worker → Behavior service: processes behavior
- Interaction worker → RabbitMQ: consumes events
- Interaction worker → Interaction service: processes actions
