I built a platform that aggregates 30+ IT news sources so you don't have to check them all
Source: Dev.to
🤔 The Problem
As a developer in Korea, I was spending way too much time every morning visiting:
- Korean tech blogs (Kakao, Toss, Woowa Brothers, Naver, Line)
- IT news sites (ZDNet Korea, IT Donga, Digital Times)
- International tech outlets
- YouTube tech channels
I wanted one place to read everything. So I built it.
🚀 Introducing 한눈IT (HanunIT)
한눈IT means “IT at a glance” in Korean. It’s a content‑aggregation platform that collects, summarizes, and serves the latest IT articles and videos in a clean reading experience.
✨ Key Features
📰 Article Aggregation
Continuously collects articles from 30+ sources via RSS feeds. New content flows in throughout the day — no manual curation needed.
📝 AI‑Powered Summaries
Every article comes with a concise summary. Scan dozens of articles in minutes and deep‑dive only into what matters to you.
🌐 Translated Articles
International tech articles are auto‑translated into Korean, bridging the language gap for Korean‑speaking developers.
🎬 Tech Video Curation
Curated YouTube tech videos are collected alongside written articles. Switch between reading and watching depending on your mood.
💬 Community Features
Comment on articles, like your favorites, and join discussions with other developers.
📧 Newsletter
Subscribe to a weekly digest and get the best articles delivered to your inbox.
🛠️ Tech Stack
| Layer | Tech |
|---|---|
| Framework | Next.js 15 (App Router, Turbopack) |
| Language | TypeScript |
| Database | Supabase (PostgreSQL + RLS) |
| Auth | Supabase Auth |
| State | TanStack Query + Zustand |
| Styling | Tailwind CSS + Shadcn UI |
| Deployment | Vercel |
| Analytics | Vercel Analytics |
📐 Architecture Highlights
Server‑side rendering with caching – Article pages use
revalidate = 300for ISR. API routes returns‑maxage=300, stale‑while‑revalidate=600headers, giving fast initial loads without hitting the DB every time.// Example in a Next.js page export const revalidate = 300; // ISR: revalidate every 5 minutesParallel data fetching – Article detail pages fire multiple Supabase queries with
Promise.allSettledinstead of sequential awaits, shaving ~40 % off load times.const results = await Promise.allSettled([ supabase.from('articles').select(), supabase.from('comments').select(), ]);Smart client caching – TanStack Query with a 5‑minute stale time and 30‑minute garbage collection. Users navigating between pages almost never see a loading spinner.
Per‑request deduplication – Used
React.cache()for article fetches in server components, sogenerateMetadataand the page component share the same data without duplicate DB calls.const fetchArticle = React.cache(async (id) => { const { data } = await supabase .from('articles') .select() .eq('id', id) .single(); return data; });
📸 Screenshots

🤷 What I Learned
- RSS feeds are messy – Every source has a slightly different format. I spent more time on parsing edge cases than I expected.
- Supabase RLS is powerful but tricky – Row Level Security policies need careful planning upfront. Debugging permission errors is not fun.
- Next.js 15 App Router is great – Server components + streaming + ISR is a solid combo for content‑heavy sites.
🙏 Feedback Welcome
I’d love to hear:
- What IT sources would you want to see added?
- Any UX improvements you’d suggest?
- Would you use something like this for your local tech ecosystem?
Thanks for reading! Drop a comment or visit to check it out.