2026년 03월 03일
Notion을 사용하면서 대시보드에 시계나 진행률 같은 위젯을 넣고 싶었는데, 기존 서비스들은 가입을 요구하거나 커스터마이징이 제한적이었다.
가입 없이 URL 쿼리 파라미터만으로 위젯을 커스터마이즈하고, Notion에 바로 임베드할 수 있는 서비스를 직접 만들기로 했다.
“URL = Single Source of Truth” — 모든 위젯 설정이 URL 쿼리 파라미터에 저장된다. 별도의 가입이나 DB 저장 없이 URL 하나만 공유하면 누구든 같은 위젯을 볼 수 있다.
사용 흐름은 단순하다:
/embed 블록에 붙여넣는다Turborepo 모노레포로 패키지를 분리하여 관리한다.
apps/web — Next.js 앱 (랜딩, 갤러리, 커스터마이저, 임베드)packages/widget-core — 위젯 타입, 레지스트리, 파라미터 파싱, 공용 프리셋packages/widgets — 개별 위젯 구현체 (6종)위젯 추가 시 registerWidget()으로 등록하면 갤러리, 커스터마이저, 임베드 라우트가 자동 생성된다.

현재 6종의 위젯을 제공한다.
카테고리 필터(시간, 생산성, 라이프스타일, 유틸리티)로 원하는 위젯을 빠르게 찾을 수 있다.

좌측 패널에서 색상, 언어, 시간 형식 등을 변경하면 우측의 실시간 미리보기에 즉시 반영된다.
컨트롤은 위젯별로 다르게 구성되며, color, select, toggle, date, text 등 6종의 컨트롤 타입을 지원한다.
언어와 날짜 형식은 공용 프리셋(widget-core/presets.ts)으로 관리하여 7개 언어(한국어, English, 日本語, 中文, Deutsch, Français, Español)를 모든 위젯에서 일관되게 지원한다.
하단의 임베드 URL을 복사해 Notion에 붙여넣으면 끝이다.
한국어/영어 2개 언어를 딕셔너리 패턴으로 지원한다. 외부 라이브러리 없이 Dictionary 타입과 getDictionary() 함수만으로 구현했다.
SEO는 sitemap.xml(hreflang), robots.txt, OG 메타태그, JSON-LD를 포함하며 각 라우트별로 next/og ImageResponse를 활용한 동적 OG 이미지를 생성한다.
“기능은 무료, 미학은 유료” — 모든 위젯 기능은 무료로 제공하고, 워터마크 제거와 프리미엄 테마/폰트를 Pro(일회성 결제)로 제공할 예정이다.
Turborepo 모노레포 + Next.js 16 정적 생성으로 28개 페이지를 빌드하며, Vercel 한국 리전에 배포하여 국내 사용자에게 빠른 응답 속도를 제공한다.
현재 Phase 0(제품화)이 완료된 상태이며, 위젯 추가와 기능 개선을 진행 중이다.
20대에게 맞는 혜택 정보는 넘쳐나는데, 정작 "내가 받을 수 있는 혜택"을 한눈에 보기는 어렵다. 카드 캐시백, 청년 지원금, 대학생 할인, 군인 혜택 등 조건만 맞으면 바로 쓸 수 있는 혜택들을 영수증 스타일로 큐레이션하는 서비스를 만들었다. ## 핵심 컨셉 **"몰랐던 혜택, 3초 만에 발견"** — 복잡한 조건 설명 대신, 각 혜택의 핵심 금액과 실행 방법을 영수증처럼 한눈에 보여준다. 디자인 컨셉은 레트로 영수증이다. 크림 배경에 코랄/라임 액센트, 지그재그 모서리, 바코드까지 — 편의점에서 받은 영수증을 들여다보는 느낌으로 정보를 전달한다. ## 기술 스택 - **Framework**: Next.js 16 (App Router, Static Export) - **Language**: TypeScript 5 - **Styling**: Tailwind CSS 4 - **Content**: MDX + gray-matter (DB 없이 파일 기반) - **Monorepo**: Turborepo + pnpm - **Analytics**: PostHog (page_view only) + GA4 - **SEO**: JSON-LD (Article, WebSite, ItemList), sitemap, OG meta - **Deploy**: Vercel ## 아키텍처 `Turborepo` 모노레포 구조로 콘텐츠와 웹앱을 분리했다. - `apps/web` — Next.js 앱 (홈, 팁 상세, 카테고리 필터) - `packages/content` —...
1분기가 끝났다. GitHub 정리해보니 3개월 동안 3개 레포에서 152건 정도 작업했더라. 많이 만들긴 했다. 성과도 나오고 있고, D2C 퍼널 데이터도 잘 나오고 있다. 그런데 이 글을 쓰면서 계속 드는 생각이 있다. `'OKR 목표를 바라보고 달렸나?'` 이 질문에는 자신 있게 답하기 어렵다. ## 무엇을 했나 ### D2C — 0에서 1로 만든 제품 1분기에서 가장 큰 작업은 D2C 서비스를 처음부터 만들어서 런칭한 거다. 1월 말부터 근무지 선택, 월급일 입력 같은 초기 플로우를 만들기 시작했고, 2월 초~중순에 온보딩, CMS 자동이체, 본인인증, 상환 페이지, 급여계좌 R2 업로드 같은 핵심 기능을 완성했다. 2월 중순부터는 QA에 집중하고 바로 오픈할 정도로 촉박한 일정이었다. 런칭 후에는 Amplitude, PostHog 기반으로 퍼널 데이터 수집하고, 전환율 떨어지는 구간 잡아서 개선하고, 성과 측정까지 진행했다. 데이터는 잘 나오고 있다. ### 신분증 OCR 원래 Tesseract로 OCR을 붙였는데 인식률이 좋지 않았다. 코드에프, 네이버 클로바 등 여러 솔루션을 찾아봤는데, 문득 `'그냥 AI로 해볼까?'` 싶어서 Claude Vision을 붙여봤다. 프롬프트에 따라 인식률이 꽤 높아서 그대로 진행했다. 여러 선택지...
카카오같이가치는 카카오가 운영하는 사회공헌 플랫폼으로, 좋아요와 댓글만으로도 기부에 참여할 수 있는 서비스다. 매일 접속해서 참여하면 좋겠지만, 수백 개에 달하는 기부 항목을 매번 수동으로 처리하는 것은 현실적으로 어렵다. 자동화 기술을 활용하면 꾸준하게 참여할 수 있겠다는 생각에 크롬 익스텐션으로 개발하게 됐다. 기술 스택 Extension: Chrome Manifest V3, Service Worker Frontend: React 18 Build: Vite 5 CORS 문제 해결 크롬 익스텐션 환경에서 카카오 API를 직접 호출하면 CORS 오류가 발생한다. Extension의 Origin이 chrome-extension://... 형태이기 때문에 카카오 서버에서 요청을 거부한다. 이를 해결하기 위해 declarativeNetRequest API를 활용하여 요청 헤더를 자동으로 교체했다. { "action": { "type": "modifyHeaders", "requestHeaders": [ { "header": "Origin", "operation": "set", "value": "https://together.kakao.com" } ] }, "condition": { "urlFilter": "*together*kakao.com*", "resourceTypes": ["xmlhttprequest"] } } rules.json을 통해 글로벌 규칙을 적용하니 fetch 호출 코드에서 헤더를 별도로 관리할 필요가 없어졌다. 자동화 로직 핵심 자동화는 Service Worker(background.js)에서 처리한다. 실행 흐름: 기부 목록 수집: 전체 페이지를 순회하며 진행 중인(STATUS_FUNDING) 항목 수집 중복 필터링: chrome.storage에 저장된 참여 기록과 비교하여 미참여...