# mevander88/urprojects architecture

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

- Interactive diagram: https://gitdiagram.com/mevander88/urprojects
- Repository: https://github.com/mevander88/urprojects

## Overview

This repository contains three streaming-catalog prototypes—anime, Chinese drama, and Korean drama—plus a small projects landing site. Their user flows cover catalog discovery, title and episode browsing, and playback; the anime prototype also exposes bookmarks and viewing history. Each content prototype pairs a Next.js frontend with a Go scraper API. Sampled code confirms selected API and media-proxy behavior, but not most page-to-API wiring, so those links are omitted.

Main entry points: [`urdrachin-prototype/urdrachin-api/cmd/api/main.go`](https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/urdrachin-api/cmd/api/main.go) (API startup), [`uranime-prototype/uranime-api/internal/scraper`](https://github.com/mevander88/urprojects/tree/main/uranime-prototype/uranime-api/internal/scraper) (Anime scraper), [`uranime-prototype/uranime-api/cmd/api/main.go`](https://github.com/mevander88/urprojects/blob/main/uranime-prototype/uranime-api/cmd/api/main.go) (API startup), [`ursarang-prototype/ursarang-api/cmd/api/main.go`](https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/ursarang-api/cmd/api/main.go) (API startup)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_portfolio["Projects site"]
  node_projects["Project landing<br/>[page.tsx]"]
  node_projects_data["Project data<br/>[projects.ts]"]
end

subgraph group_anime["Anime prototype"]
  node_anime_pages["Anime pages"]
  node_anime_episode["Episode data route<br/>[route.ts]"]
  node_anime_api_client["API client<br/>[api.ts]"]
  node_anime_stream["Stream proxy<br/>[route.ts]"]
  node_anime_media["Image proxy<br/>[route.ts]"]
  node_anime_main["API startup<br/>[main.go]"]
  node_anime_router["API routes<br/>[router.go]"]
  node_anime_search["Search handler<br/>[search_handler.go]"]
  node_anime_scraper["Anime scraper"]
end

subgraph group_urdrachin["Chinese drama"]
  node_urdrachin_pages["Drama pages"]
  node_urdrachin_api_proxy["API forwarding route<br/>[route.ts]"]
  node_urdrachin_media["Media proxy<br/>[route.ts]"]
  node_urdrachin_main["API startup<br/>[main.go]"]
  node_urdrachin_router["API routes<br/>[router.go]"]
  node_urdrachin_scraper["Scraper client<br/>[client.go]"]
end

subgraph group_ursarang["Korean drama"]
  node_ursarang_pages["Drama pages"]
  node_ursarang_stream_route["Stream route<br/>[route.ts]"]
  node_ursarang_api_client["API client<br/>[api.ts]"]
  node_ursarang_media["Media proxy<br/>[route.ts]"]
  node_ursarang_main["API startup<br/>[main.go]"]
  node_ursarang_router["API routes<br/>[router.go]"]
  node_ursarang_scraper["Drama scraper"]
end

node_visitor(("Visitor"))
node_anime_source(("Anime source"))
node_urdrachin_source(("Drama source"))
node_ursarang_source(("Drama source"))

node_visitor -->|"browses"| node_projects
node_projects -->|"reads"| node_projects_data
node_visitor -->|"browses"| node_anime_pages
node_anime_episode -->|"calls"| node_anime_api_client
node_anime_main -->|"registers"| node_anime_router
node_anime_main -->|"creates client"| node_anime_scraper
node_anime_search -->|"searches"| node_anime_scraper
node_anime_scraper -->|"fetches"| node_anime_source
node_anime_stream -->|"proxies media"| node_anime_source
node_anime_media -->|"fetches images"| node_anime_source
node_visitor -->|"browses"| node_urdrachin_pages
node_urdrachin_api_proxy -->|"forwards API"| node_urdrachin_main
node_urdrachin_main -->|"registers"| node_urdrachin_router
node_urdrachin_main -->|"creates client"| node_urdrachin_scraper
node_urdrachin_scraper -->|"fetches"| node_urdrachin_source
node_urdrachin_media -->|"proxies media"| node_urdrachin_source
node_visitor -->|"browses"| node_ursarang_pages
node_ursarang_stream_route -->|"calls"| node_ursarang_api_client
node_ursarang_main -->|"registers"| node_ursarang_router
node_ursarang_main -->|"creates client"| node_ursarang_scraper
node_ursarang_scraper -->|"fetches"| node_ursarang_source
node_ursarang_media -->|"proxies media"| node_ursarang_source

click node_projects "https://github.com/mevander88/urprojects/blob/main/urprojects/app/page.tsx"
click node_projects_data "https://github.com/mevander88/urprojects/blob/main/urprojects/lib/projects.ts"
click node_anime_pages "https://github.com/mevander88/urprojects/tree/main/uranime-prototype/app"
click node_anime_episode "https://github.com/mevander88/urprojects/blob/main/uranime-prototype/app/episode-data/%5Bslug%5D/route.ts"
click node_anime_api_client "https://github.com/mevander88/urprojects/blob/main/uranime-prototype/lib/api.ts"
click node_anime_stream "https://github.com/mevander88/urprojects/blob/main/uranime-prototype/app/stream/route.ts"
click node_anime_media "https://github.com/mevander88/urprojects/blob/main/uranime-prototype/app/media/route.ts"
click node_anime_main "https://github.com/mevander88/urprojects/blob/main/uranime-prototype/uranime-api/cmd/api/main.go"
click node_anime_router "https://github.com/mevander88/urprojects/blob/main/uranime-prototype/uranime-api/internal/router/router.go"
click node_anime_search "https://github.com/mevander88/urprojects/blob/main/uranime-prototype/uranime-api/internal/handler/search_handler.go"
click node_anime_scraper "https://github.com/mevander88/urprojects/tree/main/uranime-prototype/uranime-api/internal/scraper"
click node_urdrachin_pages "https://github.com/mevander88/urprojects/tree/main/urdrachin-prototype/app"
click node_urdrachin_api_proxy "https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/app/api/urdrachin/%5B...path%5D/route.ts"
click node_urdrachin_media "https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/app/api/media-proxy/route.ts"
click node_urdrachin_main "https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/urdrachin-api/cmd/api/main.go"
click node_urdrachin_router "https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/urdrachin-api/internal/router/router.go"
click node_urdrachin_scraper "https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/urdrachin-api/internal/scraper/client.go"
click node_ursarang_pages "https://github.com/mevander88/urprojects/tree/main/ursarang-prototype/app"
click node_ursarang_stream_route "https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/app/api/stream/%5Bslug%5D/%5Bepisode%5D/route.ts"
click node_ursarang_api_client "https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/lib/api.ts"
click node_ursarang_media "https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/app/api/media-proxy/route.ts"
click node_ursarang_main "https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/ursarang-api/cmd/api/main.go"
click node_ursarang_router "https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/ursarang-api/internal/router/router.go"
click node_ursarang_scraper "https://github.com/mevander88/urprojects/tree/main/ursarang-prototype/ursarang-api/internal/scraper"

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_projects,node_projects_data toneBlue
class node_anime_pages,node_anime_episode,node_anime_api_client,node_anime_stream,node_anime_media,node_anime_main,node_anime_router,node_anime_search,node_anime_scraper toneAmber
class node_urdrachin_pages,node_urdrachin_api_proxy,node_urdrachin_media,node_urdrachin_main,node_urdrachin_router,node_urdrachin_scraper toneMint
class node_ursarang_pages,node_ursarang_stream_route,node_ursarang_api_client,node_ursarang_media,node_ursarang_main,node_ursarang_router,node_ursarang_scraper toneRose
class node_visitor,node_anime_source,node_urdrachin_source,node_ursarang_source toneIndigo
```

## Components

### Projects site

- [Project landing](https://github.com/mevander88/urprojects/blob/main/urprojects/app/page.tsx): `urprojects/app/page.tsx`
- [Project data](https://github.com/mevander88/urprojects/blob/main/urprojects/lib/projects.ts): `urprojects/lib/projects.ts`

### Anime prototype

- [Anime pages](https://github.com/mevander88/urprojects/tree/main/uranime-prototype/app): `uranime-prototype/app`
- [Episode data route](https://github.com/mevander88/urprojects/blob/main/uranime-prototype/app/episode-data/%5Bslug%5D/route.ts): `uranime-prototype/app/episode-data/[slug]/route.ts`
- [API client](https://github.com/mevander88/urprojects/blob/main/uranime-prototype/lib/api.ts): `uranime-prototype/lib/api.ts`
- [Stream proxy](https://github.com/mevander88/urprojects/blob/main/uranime-prototype/app/stream/route.ts): `uranime-prototype/app/stream/route.ts`
- [Image proxy](https://github.com/mevander88/urprojects/blob/main/uranime-prototype/app/media/route.ts): `uranime-prototype/app/media/route.ts`
- [API startup](https://github.com/mevander88/urprojects/blob/main/uranime-prototype/uranime-api/cmd/api/main.go): `uranime-prototype/uranime-api/cmd/api/main.go`
- [API routes](https://github.com/mevander88/urprojects/blob/main/uranime-prototype/uranime-api/internal/router/router.go): `uranime-prototype/uranime-api/internal/router/router.go`
- [Search handler](https://github.com/mevander88/urprojects/blob/main/uranime-prototype/uranime-api/internal/handler/search_handler.go): `uranime-prototype/uranime-api/internal/handler/search_handler.go`
- [Anime scraper](https://github.com/mevander88/urprojects/tree/main/uranime-prototype/uranime-api/internal/scraper): `uranime-prototype/uranime-api/internal/scraper`

### Chinese drama

- [Drama pages](https://github.com/mevander88/urprojects/tree/main/urdrachin-prototype/app): `urdrachin-prototype/app`
- [API forwarding route](https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/app/api/urdrachin/%5B...path%5D/route.ts): `urdrachin-prototype/app/api/urdrachin/[...path]/route.ts`
- [Media proxy](https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/app/api/media-proxy/route.ts): `urdrachin-prototype/app/api/media-proxy/route.ts`
- [API startup](https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/urdrachin-api/cmd/api/main.go): `urdrachin-prototype/urdrachin-api/cmd/api/main.go`
- [API routes](https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/urdrachin-api/internal/router/router.go): `urdrachin-prototype/urdrachin-api/internal/router/router.go`
- [Scraper client](https://github.com/mevander88/urprojects/blob/main/urdrachin-prototype/urdrachin-api/internal/scraper/client.go): `urdrachin-prototype/urdrachin-api/internal/scraper/client.go`

### Korean drama

- [Drama pages](https://github.com/mevander88/urprojects/tree/main/ursarang-prototype/app): `ursarang-prototype/app`
- [Stream route](https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/app/api/stream/%5Bslug%5D/%5Bepisode%5D/route.ts): `ursarang-prototype/app/api/stream/[slug]/[episode]/route.ts`
- [API client](https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/lib/api.ts): `ursarang-prototype/lib/api.ts`
- [Media proxy](https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/app/api/media-proxy/route.ts): `ursarang-prototype/app/api/media-proxy/route.ts`
- [API startup](https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/ursarang-api/cmd/api/main.go): `ursarang-prototype/ursarang-api/cmd/api/main.go`
- [API routes](https://github.com/mevander88/urprojects/blob/main/ursarang-prototype/ursarang-api/internal/router/router.go): `ursarang-prototype/ursarang-api/internal/router/router.go`
- [Drama scraper](https://github.com/mevander88/urprojects/tree/main/ursarang-prototype/ursarang-api/internal/scraper): `ursarang-prototype/ursarang-api/internal/scraper`

### Other components

- **Visitor**
- **Anime source**
- **Drama source**
- **Drama source**

## Connections

- Visitor → Project landing: browses
- Project landing → Project data: reads
- Visitor → Anime pages: browses
- Episode data route → API client: calls
- API startup → API routes: registers
- API startup → Anime scraper: creates client
- Search handler → Anime scraper: searches
- Anime scraper → Anime source: fetches
- Stream proxy → Anime source: proxies media
- Image proxy → Anime source: fetches images
- Visitor → Drama pages: browses
- API forwarding route → API startup: forwards API
- API startup → API routes: registers
- API startup → Scraper client: creates client
- Scraper client → Drama source: fetches
- Media proxy → Drama source: proxies media
- Visitor → Drama pages: browses
- Stream route → API client: calls
- API startup → API routes: registers
- API startup → Drama scraper: creates client
- Drama scraper → Drama source: fetches
- Media proxy → Drama source: proxies media
