r Update Inbox)
Replace
<OWNER>/<REPO>with your GitHub repo path after publishing.
git remote add origin <REPO_URL>pnpm badges:updategit push -u origin main
Tech Radar is a local-first Developer Update Inbox for RSS/Atom sources. It fetches updates on demand into an Inbox, lets you select & save only what matters into Posts, and keeps everything in your local database (no full-article republishing).
- Staying on top of tech changes daily is hard.
- Generic RSS readers focus on consumption, not decision-making (security/breaking/deprecation).
- You want your saved history to stay local (privacy-first).
- /presets โ load/import sources
- /fetch โ run fetch โ review Inbox
- select & save โ /posts โ build your personal knowledge base
pnpm -w db:up
cp .env.example .env
pnpm install
pnpm -w db:generate
# (optional, with approval) pnpm -w db:migrate
pnpm -w devTech Radar๋ Local-first Developer Update Inbox์ ๋๋ค. RSS/Atom ๊ธฐ๋ฐ ๋ด์คยทํ์ฌ ํ ํฌ๋ธ๋ก๊ทธยท๋ฆด๋ฆฌ์ฆ ๋ ธํธ๋ฅผ ์์ฒญ ์์ ์ ์์ง(Inbox) ํ๊ณ , ํ์ํ ๊ฒ๋ง ์ ๋ณ ์ ์ฅ(Posts) ํ๋ฉฐ, ๋ฌด๋ฃ ์์ฝ(Signals/ContentType) ์ผ๋ก ์ฌํ์ ๊ฐ๋ฅํ ๊ฐ์ธ์ฉ ๋ณด๋์ ๋๋ค.
ํต์ฌ๋ง 10์ด ์์ฝ
- โ Run-on-demand: ์๋ ํฌ๋ก ์ด ์๋๋ผ โํ์ํ ๋๋ง ์์งโ
- โ Select & Save: Inbox์์ ๊ณ ๋ฅธ ๊ฒ๋ง Posts์ ์ ์ฅ
- โ Local-first: ๋ฐ์ดํฐ๋ ๋ก์ปฌ DB์๋ง(์๋ฌธ ์ ๋ฌธ ์ ์ฅ X)
- โ ์ด์ ์์ ์ฑ ๋ด์ฅ: ์บ์/๋์์ฑ/cleanup๋ก ์์ค๊ฐ ๋ง์๋ ์์ ์ ์ผ๋ก
- ๋งค์ผ ์ต์ ๊ธฐ์ ๋ณํ๋ฅผ ์ง์ ์ฐพ์๋ณด๊ธฐ ์ด๋ ต์ต๋๋ค.
- ์ผ๋ฐ RSS ๋ฆฌ๋๋ โ์ฝ๊ธฐโ ์ค์ฌ์ด๋ผ ์ ๋ณ ์ ์ฅ / ์ ๋ฐ์ดํธ ์์ฌ๊ฒฐ์ / ์ฌ๊ฒ์์ ์ฝํฉ๋๋ค.
- ๊ฐ๋ฐ์์๊ฒ ์ค์ํ ๊ฒ์ ๋จ์ ๋ด์ค๊ฐ ์๋๋ผ security(CVE) / breaking change / deprecated ๊ฐ์ ์ฆ์ ๋์ ์ ํธ์ ๋๋ค.
- ๋ด ๋ฐ์ดํฐ(๋ฌด์์ ์ฝ๊ณ ์ ์ฅํ๋์ง)๋ฅผ ์ธ๋ถ SaaS๊ฐ ์๋๋ผ ๋ด ๋ก์ปฌ DB์๋ง ๋จ๊ธฐ๊ณ ์ถ์์ต๋๋ค.
- /presets: ์์ ํ๋ฆฌ์ ์ ๋ถ๋ฌ์ค๊ฑฐ๋ Import
- /fetch: ์์ง ์คํ โ Inbox ํ์ธ
- ์ ํ & ์ ์ฅ โ /posts: ํ์ํ ๊ฒ๋ง ๋ณด๊ด/์ฌํ์
Inbox๋ โ๊ฒํ ํโ, Posts๋ โ์ ๋ณ ์ ์ฅ๋ ์ง์ DBโ์ ๋๋ค.
- ์นดํ ๊ณ ๋ฆฌ: AI / FE / BE / DEVOPS / DATA / SECURITY / OTHER
- RSS ์นดํ ๊ณ ๋ฆฌ/ํ๊ทธ + ํค์๋ ๊ธฐ๋ฐ์ผ๋ก ์๋ ๋ถ๋ฅํฉ๋๋ค.
- ์์ค๋ฅผ ์นดํ ๊ณ ๋ฆฌ/์ธ์ด๋ก ๊ทธ๋ฃนํํด โ์ ํ ์์งโํฉ๋๋ค.
- ์์ค๋ ๋ง์ด ๋ฑ๋กํด๋ ๊ด์ฐฎ๊ณ , ์ค์ Fetch๋ ์ ํ๋ ํ๋ฆฌ์ /์์ค๋ง ๋์์ผ๋ก ์คํํฉ๋๋ค.
- Preset JSON import/export: ํ๋ฆฌ์ ๊ณต์ /๋ณต์
- OPML import/export: ๊ธฐ์กด RSS ๋ฆฌ๋ ๊ตฌ๋ ๋ชฉ๋ก ์ด์
- signals: security / breaking / deprecation / release / perf ๋ฑ ์๋ ํ๊น
- contentType: NEWS / COMPANY_BLOG / RELEASE_NOTE / OTHER
- ํ์ ๋ณ๋ก ์์ฝ ํฌ๋งท์ ๋ฌ๋ฆฌํด โ์ฝ์๋ง์ ํ๋จโ์ด ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ETag/Last-Modified(304 ์บ์)๋ก ๋ณ๊ฒฝ ์๋ ์์ค๋ ๋น ๋ฅด๊ฒ ์คํต
- ๊ธ๋ก๋ฒ ๋์์ฑ + ๋๋ฉ์ธ ๋์์ฑ + Adaptive throttling
- ์์ค๋ณ ์ต๋ 50๊ฐ ํ์ฑ ํ โ ๊ธฐ๊ฐ ํํฐ ์ ์ฉ(๊ธฐ๋ณธ 14์ผ)
- cleanup: Inbox 7์ผ ์ญ์ , FetchRun 100๊ฐ ์ ์ง
RSS๊ฐ ์๊ฑฐ๋ ํผ๋ ํ์ฑ์ด ์คํจํ๋ ๊ฒฝ์ฐ, (์ ํ์ ์ผ๋ก) HTML ๋ชฉ๋ก ํ์ด์ง๋ฅผ ํ์ฑํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ: RSS/Atom ์ฐ์
- ์ต์ : HTML fallback ์ฌ์ฉ ์ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ํ์ฑํ๊ณ ํ์ด์ง๋ค์ด์ ์ ์ ํ์ ์ผ๋ก ํ์ํฉ๋๋ค(๊ธฐ๋ณธ 3ํ์ด์ง)
HTML fallback์ ์ฌ์ดํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ/์ฐจ๋จ ๊ฐ๋ฅ์ฑ์ด ์์ด ๋ณด์กฐ ์ต์ ์ผ๋ก ๊ถ์ฅํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ ๋ก์ปฌ DB์๋ง ์ ์ฅ
- ์๋ฌธ HTML์ ๊ธฐ๋ณธ ์ ์ฅํ์ง ์์
- ์ ์ฅ ์ ๋งํฌ + ์ค๋ํซ + ์์ฝ + ๋ฉ๋ชจ ์ค์ฌ์ผ๋ก ๊ฐ๋ณ๊ณ ์์ ํ๊ฒ ๋ณด๊ด
Tech Radar๋ ๊ณต๊ฐ RSS/Atom ํผ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์งํด ๊ฐ์ธ ๋ก์ปฌ ๋ณด๋์์ ํ์ธํ๋ ๋๊ตฌ์ ๋๋ค. ์๋ฌธ์ ๋์ฒดํ๊ฑฐ๋ ์ฌ๋ฐฐํฌํ๋ ๋ชฉ์ ์ด ์๋๋ผ, ์ ๋ณยท์ ๋ฆฌยท์ฌํ์(Research Inbox) ์ฉ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- ์์ง ๋ฒ์: ์ ๋ชฉ/๋งํฌ/๋ฐํ์ผ/์งง์ ์ค๋ํซ ์ค์ฌ
- ์๋ฌธ ์ ๋ฌธ ์ ์ฅ/์ฌ๋ฐฐํฌ๋ฅผ ๋ชฉํ๋ก ํ์ง ์์ต๋๋ค.
- ToS/robots ์ ์ฑ ์ ์กด์คํ๋ฉฐ, paywall/์ ๊ทผ ์ ํ ์ฐํ ์ฉ๋๋ก ์ฌ์ฉํ์ง ๋ง์ธ์.
This project is intended for personal/local use. It does not republish full articles and links back to original sources.
ํ์: Docker Desktop, Node.js >= 20.19, pnpm
- DB ์คํ
pnpm -w db:up- ํ๊ฒฝ๋ณ์
cp .env.example .env์์(Docker ํฌํธ 54321):
DATABASE_URL="postgresql://techradar:techradar@localhost:54321/tech_radar"
- ์ค์น/์ค๋น
pnpm install
pnpm -w db:generate
# ํ์ ์(์ฌ์ฉ์ ์น์ธ ํ) pnpm -w db:migrate- ์คํ
pnpm -w dev์ ์
Docker ์์ด ๋ก์ปฌ Postgres๊ฐ ์๋ค๋ฉด .env์ DATABASE_URL๋ง ๋ก์ปฌ DB๋ก ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
pnpm install
pnpm -w db:generate
# ํ์ ์(์ฌ์ฉ์ ์น์ธ ํ) pnpm -w db:migrate
pnpm -w dev- DB ์ค๋น
- Docker: pnpm -w db:up
- ๊ธฐ์กด Postgres: .env์ DATABASE_URL ํ์ธ
- ์ฑ ์คํ
- pnpm -w dev
- ๋์ ํ์ธ
- /presets โ ์์ ๋ถ๋ฌ์ค๊ธฐ (Woowahan Tech)
- /fetch โ ์์ง ์คํ โ Inbox ์์ดํ ํ์ธ
- 1~2๊ฐ ์ ํ ์ ์ฅ โ /posts์์ ํ์ธ
API health check:
curl http://localhost:4002/health์ด ๋ ํฌ๋ ๋จ์ผ ์์ preset๋ง ์ ๊ณตํฉ๋๋ค.
- repo: examples/presets/woowahan.json
- web ์ ์ : apps/web/public/examples/presets/woowahan.json
์์ ๋ถ๋ฌ์ค๊ธฐ:
- /presets โ ์์ ๋ถ๋ฌ์ค๊ธฐ (Woowahan Tech)
๋๋ง์ ์์ค ์ถ๊ฐ:
- /sources์์ ์ง์ ์ถ๊ฐํ๊ฑฐ๋,
- Preset JSON/OPML๋ก import ํ์ธ์.
Preset JSON Export:
- UI: /presets โ Export JSON
- API:
- GET /v1/presets/:id/export?format=json
Preset JSON Import:
- UI: /presets โ Import
- API:
- POST /v1/presets/import
.env.example ์ฃผ์ ์ค์ :
- LOOKBACK_DAYS (default 14, UI์์ 1/7/30/180์ผ ์ ํ ์ ๋ฎ์ด์)
- MAX_ITEMS_PER_SOURCE (default 50)
- FETCH_CONCURRENCY (default 6)
- FETCH_DOMAIN_CONCURRENCY (default 2)
HTML fallback:
- HTML_FALLBACK_ENABLED (default true)
- HTML_FALLBACK_MAX_PAGES (default 3)
์ ๋ฆฌ ์ ์ฑ :
- CLEANUP_INBOX_DAYS (default 7)
- CLEANUP_RUN_KEEP (default 100)
pnpm -w verify๋๋(๊ฐ๋ณ ์คํ):
pnpm -w type-check
pnpm -w lint
pnpm -w db:generate
pnpm --filter @tech-radar/summarizer testdb:migrate๋ ์๋ ์คํํ์ง ์์ต๋๋ค. (ํ์ ์ ์ฌ์ฉ์ ์น์ธ ํ ์คํ)
- ๊ธฐ๊ฐ ๋ด ๊ธ์ด ๋ถ์กฑํ ์ ์์ต๋๋ค โ ๊ธฐ๊ฐ์ 30/180์ผ๋ก ๋๋ ค๋ณด์ธ์.
- ์ค๋ณต ์ ๊ฑฐ/์ด์ ์ ๋ณธ ๊ธ ์ ์ธ ์ต์ ๋๋ฌธ์ ์ค์ด๋ค ์ ์์ต๋๋ค.
- ์์ค ์คํจ(403/429/timeout)์ผ ์ ์์ต๋๋ค โ /sources์์ ์คํจ ์์ค ํ์ธ/๋นํ์ฑํ
- ์ผ๋ฐ URL์ RSS๊ฐ ์์ ์ ์์ต๋๋ค โ HTML fallback ์ต์ ์ด ์ผ์ ธ ์์ด์ผ ๋ชฉ๋ก ํ์ฑ์ ์๋ํฉ๋๋ค.
- docker compose ps์์ DB๊ฐ healthy์ธ์ง ํ์ธ
- .env์ DATABASE_URL ํฌํธ(54321) ํ์ธ
- worker๊ฐ ์คํ ์ค์ธ์ง ํ์ธ (pnpm -w dev์ ํฌํจ)
- MIT License: LICENSE
- preset ๊ณต์ PR(์: examples/presets/์ ์๋ก์ด preset ์ถ๊ฐ)์ ํ์ํฉ๋๋ค.
- ๊ธฐ์ฌ ๊ฐ์ด๋๊ฐ ์๋ค๋ฉด CONTRIBUTING.md๋ฅผ ์ฐธ๊ณ ํ์ธ์.