키워드를 켜두면,
소식이 모입니다.
뉴스·공시·지원사업·정책·특허까지 분야를 가리지 않고 모아, 같은 사건은 하나로 묶고, 출처 본문과 대조한 요약만 실시간 피드와 알림으로 보여줍니다.
지금 어디까지 됐나
초기 버전은 주식 뉴스와 실시간 트렌드를 모아 사건 카드로 보여줍니다. 설계와 다르게 구현한 부분은 이유와 함께 적어 둡니다. 이 표는 구현이 바뀔 때마다 함께 고칩니다.
| 항목 | 상태 | 실제 구현 · 설계와 다른 점 |
|---|---|---|
| 수집: 뉴스 | 동작 | 구글 뉴스 RSS. 네이버 뉴스 수집기는 있으나 API 키 대기 |
| 수집: 공시 | 키 대기 | DART 수집기 구현, API 키를 넣으면 켜짐 |
| 수집: 트렌드 | 동작 | 구글 실시간 검색 트렌드(국내) 상위 15개 + 트렌드별 관련 기사. 설계에 없던 분야로 마케팅용으로 추가 |
| 기본 키워드 | 동작 | 시장 5 · 종목 7 · 테마 3 (코스피, 삼성전자, AI 반도체 등). 사용자가 직접 입력하는 키워드는 아직 없음 |
| 같은 사건 묶기 | 동작 | 제목 글자 2-gram 겹침 50% 이상 + 36시간 안. 카드 id는 가장 먼저 나온 기사 기준. 3곳 이상이면 "여러 매체" 배지 |
| AI 요약 | 키 대기 | 사건마다 한 번, 묶인 기사들의 제목·설명만 입력(원문 안 씀). 제목 2개 이상이거나 설명이 있는 카드만 요약. 지금 구글 뉴스만으로는 약 4%(305건 중 12건)만 해당 → 네이버 뉴스 키가 있어야 대부분 붙음. Anthropic API 키를 넣으면 켜짐 |
| 근거 검증 | 일부 | 요약에 입력에 없는 숫자가 있으면 버림. 출처 본문 대조는 원문 접근 경로(네이버 원문 링크)가 생긴 뒤 |
| 중요도 | 일부 | 매체 수 기준만. 공시 종류 · 마감 임박 규칙은 해당 수집기와 함께 |
| 화면: 피드 | 동작 | 키워드 칩, 날짜 머리글, 시각 배지 카드, 키워드 강조, 요약이 있으면 2줄 미리보기 + "AI 요약" 배지 |
| 화면: 하단 탭 | 바꿈 | 설계는 피드 · 키워드 · 알림. 초기 버전은 피드 · 트렌드 · 키워드 (알림은 계정·푸시가 생기는 3단계에서) |
| 화면: 카드 상세 | 동작 | 앱 안 상세(#c/{id}): AI 요약, 이 소식을 다룬 곳, 같은 키워드의 다른 소식. 원문은 "원문 보기"를 눌렀을 때만 새 탭. 뒤로 가기는 목록의 같은 위치로. 카드 펼침은 없앰 |
| 화면: 키워드 상세 | 없음 | 다음 단계 |
| 새 소식 띠 | 동작 | 설계는 30초 개수 조회. 초기 버전은 60초마다 피드 파일 전체를 다시 읽음(정적 파일이라 개수 API 없음) |
| 키워드 저장 | 동작 | 브라우저(localStorage)에만. 로그인 · 서버 저장은 3단계 |
| PWA | 동작 | 홈 화면 설치, 서비스 워커(화면은 캐시, 피드는 네트워크 우선), 다크 모드 |
| 로그인 · 웹 푸시 · 알림 | 없음 | 3단계 |
| 서버 구조 | 바꿈 | 설계는 Pages Functions + D1 API. 초기 버전은 정적 피드 파일: 맥에서 15분마다 수집 → feed.json → 더 최근 카드가 있거나 1시간 지나면 Pages 배포 |
변경 기록
- 10-21 앱 이탈 막기: 카드·트렌드 기사는 앱 안 상세로, 외부 링크는 "원문 보기"에서만
- 10-21 AI 요약 파이프라인(사건당 1회, 제목·설명만 입력, 없는 숫자 버림, 요약 저장). API 키 대기
- 10-21 설계서와 구현을 함께 갱신하는 규칙을 정하고 구현 현황 표 추가
- 10-21 코인니스 첫 실행 흐름 관찰 → 첫 실행은 키워드 고르기부터, 알림 권한은 첫 피드 뒤에 묻는 방향 확정
- 10-21 15분 정기 갱신(launchd) · 배포 조건(새 카드 또는 1시간) · 카드 id 고정
- 10-21 초기 버전 공개: 주식 키워드 + 실시간 트렌드, 피드 · 트렌드 · 키워드 탭
- 10-21 Prospect 의존성 제거, 분야별 수집 구조(뉴스 · 공시 · 트렌드)
- 10-21 설계서 첫 공개
무엇을, 누구에게, 왜
관심사는 여러 분야에 흩어져 있는데, 소식은 매체마다 따로 나오고 같은 내용이 수십 번 반복됩니다. Keyon은 키워드 하나로 이 흐름을 한 줄의 타임라인으로 정리합니다.
핵심 가치
분야를 가리지 않음
키워드 하나로 뉴스, 공시, 지원사업 공고, 정책·법령, 특허, 연구, 입찰까지 함께 찾습니다.
같은 사건은 카드 하나
여러 매체가 다룬 같은 소식은 한 카드로 묶고 출처 수를 보여줍니다. 요약도 사건마다 한 번만 합니다.
근거가 확인된 요약
요약 문장을 출처 본문과 대조해 확인된 것에만 검증 배지를 붙입니다. 원문에 없는 수치는 넣지 않습니다.
앱 없이도 알림
설치형 PWA와 웹 푸시로 시작합니다. 키워드마다 끔 / 중요만 / 전체 중에서 알림 단계를 고릅니다.
대상 사용자
개인 투자자
보유 종목의 뉴스와 공시를 한곳에서 보고, 중요한 것만 바로 알림으로 받고 싶은 사람.
창업자·소상공인
지원사업 공고와 관련 정책 변화를 놓치지 않고, 마감 전에 알림을 받고 싶은 사람.
실무자·연구자
자기 분야의 기술, 경쟁사, 규제 움직임을 매일 따라가야 하는 사람.
지키는 원칙
출처를 먼저
- 기사 원문을 저장하거나 보여주지 않습니다. 제목, 짧은 AI 요약, 출처명, 원문 링크만 둡니다.
- 원문 링크는 앱 안 브라우저로 엽니다.
조용하게 시작
- 1~3단계에는 광고, 거래 연결, 포인트·배지 같은 게임화를 넣지 않습니다.
- 투자 조언이나 전망을 쓰지 않고 무엇이 일어났는지와 근거, 이전 맥락만 보여줍니다.
공식 경로로 수집
- 공식 API를 먼저 씁니다. robots.txt가 막는 곳은 수집하지 않습니다.
- 수집기는 LLM을 부르지 않습니다. 요약은 서버에서 API 키 과금 방식으로 합니다.
흐름을 끊지 않음
- 카드는 그 자리에서 펼칩니다. 상세 화면은 공유·푸시·근거 보기로 들어올 때만 씁니다.
- 푸시·공유·위젯은 모두 같은 고정 주소로 바로 열립니다.
요금제 (초안)
| 요금제 | 키워드 | 알림 | 그 밖의 기능 |
|---|---|---|---|
| 무료 | 3개 | 하루 요약 1회 + 중요 알림 | 피드, 카드 펼침, 키워드 상세 |
| 프로 (구독) | 무제한 | 실시간 푸시, 키워드별 단계 | 분야별 필터, 지난 기록 검색, 방해 금지 시간 |
프로 가격은 키워드당 수집 주기 × 사건당 요약 비용으로 계산합니다. 기사마다가 아니라 사건마다 요약하므로 비용은 기사 수가 아니라 사건 수에 비례합니다.
키워드 하나, 여러 분야
수집기마다 분야(domain)를 갖고, 키워드 종류에 따라 기본으로 켜는 분야가 다릅니다. 사용자는 키워드마다 분야를 켜고 끌 수 있습니다.
구글 뉴스 RSS · 네이버 뉴스 검색 API(키 대기)
구글 실시간 검색 트렌드(국내) + 트렌드별 관련 기사
DART 공시검색 API. 회사명·보고서명으로 거름
기업마당 공고 API · K-Startup 공식 API
정책브리핑 RSS · 국회 의안정보 API
국가법령정보 API (제정·개정 알림)
KIPRIS Plus API
국내 학술 API · arXiv
구글 뉴스 RSS 영어권
나라장터 입찰공고 API
Hacker News API
키워드 종류별 기본 분야
| 키워드 종류 | 예시 | 기본으로 켜는 분야 |
|---|---|---|
| 종목(상장사) | 삼성전자 | 뉴스 · 공시 |
| 지원사업 | 창업지원금 | 지원사업 · 정책 · 뉴스 |
| 정책·법령 | 가상자산 과세 | 뉴스 · 정책 · 법령·의안 |
| 기술·연구 | 전고체 배터리 | 뉴스 · 특허 · 연구 · 해외 뉴스 |
| 일반 주제 | 저출생 | 뉴스 (+ 결과가 있는 분야를 자동 제안) |
다섯 단계
분야별 수집 → 같은 사건 묶기 → 요약 → 근거 검증 → 중요도 → 저장. 5~15분 주기. 피드·카드 API.
진행 중 수집 · 묶기 · 15분 갱신 동작. 요약 · 검증 · API는 남음
피드, 카드 펼침·상세, 키워드 상세, 키워드 추가(로그인 없이 브라우저 저장), 새 소식 띠, 다크 모드·글자 크기. Cloudflare Pages + D1.
초기 버전 공개 피드 · 트렌드 · 키워드 탭, 새 소식 띠, 설치형 PWA
로그인, 구독 저장, 무료 한도, 웹 푸시, 알림 목록·설정, 하루 요약.
Flutter(안드로이드 먼저), 앱 푸시, 홈 화면 위젯(키워드 묶음 선택), 결제.
카드별 토론, 키워드 방, 카드를 인용한 글쓰기.
탭 셋, 축은 키워드
모든 화면이 켜둔 키워드 단위로 움직입니다. 피드 위 칩, 키워드 상세, 알림 단계, 위젯이 같은 키워드 목록을 공유합니다.
하단 탭
- 피드: 기본 화면. 켜둔 키워드 칩 + 시간순 카드
- 키워드: 켜기·끄기, 추가, 순서, 분야, 한도
- 알림: 받은 알림 목록, 알림 설정
- 상단 바: 로고 · 검색 · 설정
- 5단계: 커뮤니티 탭 추가
- 초기 버전: 알림 탭 자리에 트렌드 탭 (알림은 3단계)
| 주소 | 화면 |
|---|---|
/ | 피드 (전체) |
/?k={slug} | 피드, 키워드 칩 선택 |
/k/{slug} | 키워드 상세 |
/c/{cardId} | 카드 상세 (공개, og 태그) |
/keywords, /keywords/add | 키워드 관리, 추가 |
/alerts, /settings/alerts | 알림 목록, 설정 |
/settings | 테마, 글자 크기, 계정 |
주요 화면
아래 시안은 이 페이지의 디자인 토큰으로 직접 그렸습니다. 위쪽 테마 전환과 아래 글자 크기 전환이 시안에도 그대로 적용됩니다.
삼성전자, 3분기 잠정 영업이익 발표
메모리 가격 회복으로 전 분기보다 영업이익이 늘었다고 공시했다. 반도체 부문이 증가를 이끌었다.
중기부, 내년 창업지원 예산 확대안 발표
예비창업패키지 선정 규모를 늘리는 안을 내놓았다. 세부 공고는 연말에 나온다.
전고체 배터리 전해질 관련 특허 공개
황화물계 전해질의 수분 안정성을 높이는 방법에 대한 출원이 공개됐다.
삼성전자, 3분기 잠정 영업이익 발표
메모리 가격 회복으로 전 분기보다 영업이익이 늘었다고 공시했다. 반도체 부문이 증가를 이끌었고, 모바일 부문은 신제품 출시 효과가 이어졌다. 확정 실적은 이달 말 발표한다.
삼성전자 자기주식 취득 결정
주요사항보고서를 통해 자기주식 취득을 결정했다고 밝혔다.
삼성전자, 3분기 잠정 영업이익 발표
/c/{id}푸시·공유로 들어오는 곳. 검증 상태와 출처 목록, 하단 고정 행동3분기 잠정 영업이익 발표
메모리 가격 회복으로 전 분기보다 영업이익이 늘었다.
자기주식 취득 결정
주요사항보고서를 통해 자기주식 취득을 결정했다.
파운드리 2나노 고객사 추가 확보설
업계 보도가 나왔으나 회사는 확인하지 않았다.
/k/{slug}종류 · 언급 추이 · 결과가 있는 분야만 탭으로SK하이닉스 알림을 어떻게 받을까요?
나중에 키워드 탭에서 바꿀 수 있어요
어떤 소식을
켜둘까요?
하나 이상 고르면 바로 피드를 만들어 드려요. 로그인은 나중에 해도 돼요.
새 소식이 오면 여기에 바로 보여드릴게요.
분야를 더 켜면 더 많이 찾을 수 있어요.
움직임의 규칙
카드 → 앱 안 상세
- 목록: 제목 2줄 + 요약 2줄
- 상세(카드를 누름): 요약 전체 + 이 소식을 다룬 곳 + 같은 키워드의 다른 소식
- 외부로 나가는 길은 상세의 "원문 보기" 하나뿐(새 탭). 뒤로 가기는 목록의 같은 위치로
- 초기 설계의 "그 자리 펼침"은 앱 이탈 막기를 위해 상세로 바꿈
새 소식 띠
- 피드가 열려 있으면 30초마다 새 카드 개수만 조회
- 새 카드가 있으면 상단에 "새 소식 N건". 누르면 맨 위로 가며 목록을 다시 받음
- 스크롤 위치를 갑자기 바꾸지 않음
읽은 위치
- 마지막으로 본 카드를 기억
- 다시 열면 "여기까지 읽었어요" 구분선
- 키워드 칩마다 스크롤 위치를 따로 기억
키워드 강조
- 제목·요약에서 켜둔 키워드와 별칭에 형광펜 밑줄
- 예: 삼성전자 · 삼전 · Samsung Electronics
확인 창 대신 토스트
- 켜기·끄기·저장은 바로 반영하고 토스트로 알림
- 되돌릴 수 있는 동작이면 토스트에 "되돌리기"
- 되돌릴 수 없는 동작(계정 삭제)만 확인 창
바텀시트
- 선택지 3~6개는 바텀시트(알림 단계, 분야, 정렬)
- 끌어 내리거나 바깥을 눌러 닫음
필요한 것만, 필요한 때에
| 단계 | 방식 |
|---|---|
| 2 PWA | 30초 개수 조회 → 새 소식 띠 |
| 3 계정·푸시 | 웹 푸시(VAPID). 키워드별 단계 · 방해 금지 · 하루 요약 |
| 4 앱 | 앱 푸시 + 홈 위젯(키워드 묶음, 항목을 누르면 /c/{id}) |
중요도 규칙 (규칙 먼저, LLM은 보조)
- 같은 사건을 다룬 매체 수
- 공시 종류 (주요사항보고, 잠정실적 등)
- 지원사업 마감 임박 (D-3, D-1)
- 법령 공포·시행일
- 키워드가 제목에 있는지
중요만 단계는 중요 카드만, 전체 단계는 모든 새 카드를 보냅니다. 알림 권한은 첫 키워드를 켜고 피드를 본 뒤에 묻습니다.
Keyon 디자인 시스템
강조색 하나와 회색 단계로 조용하게. 색은 "켜짐"(키워드, 활성, 검증)에만 쓰고, 주의를 끌어야 할 때(중요)는 다른 색 하나만 씁니다.
원칙
켜짐 = 초록
강조색은 켜진 상태(토글, 선택 칩, 키워드 강조, 검증)에만 씁니다.
시간이 축
시각 배지는 늘 왼쪽 열에 둡니다. 눈이 세로로 시간을 따라갑니다.
선 하나로 구분
카드는 그림자 대신 얇은 선으로 나눕니다. 그림자는 떠 있는 것(시트, 토스트)에만.
두 테마 동등
라이트·다크를 처음부터 같은 토큰으로 만들고 대비를 각각 확인합니다.
색
글자
Pretendard. 숫자는 표 정렬(tabular-nums). 본문 줄간격 1.5~1.65. 한국어 줄바꿈은 단어 단위(keep-all).
간격 · 모서리 · 그림자
간격 (4의 배수)
화면 좌우 여백 14~16, 카드 안쪽 12, 섹션 사이 24.
모서리
배지 6, 버튼·입력 12, 시트 20, 칩·토글 pill.
그림자
평면(선)과 떠 있음(시트·토스트·새 소식 띠) 두 가지만.
컴포넌트
| 카드 요소 | 규칙 |
|---|---|
| 시각 배지 | 오늘은 HH:MM, 그 전은 M.DD. 왼쪽 52px 열 고정 |
| 제목 | 2줄 말줄임. 켜둔 키워드 강조 |
| 요약 | 접힘 2줄, 펼침 전체(최대 5문장). 원문에 없는 수치 금지 |
| 배지 순서 | 중요 → 검증 → 분야 → 출처명 외 N곳 |
| 행동 | 키워드 칩 · 원문(앱 안 브라우저) · 공유. 투표·댓글은 5단계 |
접근성
- 본문 대비 4.5:1 이상, 배지 글자 3:1 이상 (두 테마 모두)
- 누를 수 있는 영역 최소 44×44
- 글자 크기 3단계(보통·크게·아주 크게). 카드 높이는 글자에 맞춰 늘어남
- 움직임 줄이기 설정이면 스켈레톤·전환 애니메이션 끔
- 색만으로 뜻을 전하지 않음: 중요·검증 배지에는 항상 글자
수집에서 알림까지
백엔드는 Python(수집·묶기·요약·검증), 서비스 쪽은 Cloudflare Pages Functions + D1.
keyon build가 수집 → 묶기까지 해서 web/data/feed.json을 만들고, 정적 PWA가 이 파일을 읽습니다. 맥의 정기 실행(launchd)이 15분마다 돌며, 지금 피드보다 더 최근 카드가 있거나 1시간이 지났을 때만 Pages에 배포합니다. 요약·검증·D1·API는 아직 없습니다.데이터 모델
| 테이블 | 주요 열 |
|---|---|
| keyword | id, slug, name, kind, aliases, corp_code |
| item | id, keyword_id, source, domain, title, url, publisher, snippet, published_at — 본문 열 없음 |
| card | id, keyword_id, title, summary, importance, verified, first_seen_at, updated_at |
| card_item | card_id, item_id (같은 사건 묶음) |
| user | id, plan, created_at |
| subscription | user_id, keyword_id, alert_level, domains, position |
| push_endpoint | user_id, endpoint, keys |
| notification | id, user_id, card_id, sent_at, read_at |
| user_settings | quiet_start, quiet_end, digest_time, theme, font_size, bookmark_card_id |
API
| 요청 | 용도 |
|---|---|
GET /api/feed?k=&before= | 카드 목록 (커서, 20건씩) |
GET /api/feed/count?k=&since= | 새 카드 수 (30초) |
GET /api/cards/{id} | 카드 상세 + 출처 + 이전 관련 |
GET /api/keywords?q=&kind= | 검색·추천 (오늘 건수) |
GET /api/keywords/{slug}?tab= | 키워드 상세 |
PUT/DELETE /api/me/subscriptions/{id} | 켜기·끄기·알림 단계·분야 |
POST /api/me/push | 웹 푸시 구독 |
GET/PATCH /api/me/settings | 설정 |
실시간 속보 앱에서 배운 것
국내 가상자산 속보 서비스(코인니스)의 안드로이드 앱과 모바일 웹을 하위 화면까지 살펴봤습니다. 배치와 흐름만 참고하고, 로고·문구·색·아이콘은 쓰지 않습니다.
가져온 것
- 시각 배지가 왼쪽에 붙은 타임라인 카드
- 카드를 그 자리에서 펼치기
- 같은 사건의 이전 소식 연결
- 종목별 페이지(시세·속보·뉴스·토론) → 키워드 상세
- "중요만 / 전체" 알림 단계
- 본문 속 종목명·별칭 강조
- 구독 추가 화면(분류 칩 + 검색 + 추가 버튼)
- 위젯의 "최대 5개 고르기", 항목을 누르면 상세로 바로
- 책갈피(마지막으로 읽은 곳부터), 글자 크기, 다크 모드
- 웹의 30초 개수 조회 방식
다르게 가는 것
- 하단 탭 5개(거래·속보·커뮤니티·마켓·라이브) → 3개
- 피드·상세·검색 곳곳의 광고 → 1~3단계 광고 없음
- AI 분석이 투자 해석(단기·중장기 영향) → 사실 요약 + 근거 검증
- 기사 하나 = 카드 하나 → 같은 사건은 카드 하나
- 한 분야(가상자산) → 여러 분야
- 웹은 앱 설치 유도, 웹 푸시 없음 → PWA + 웹 푸시가 기본
- 앱에서 새 글은 당겨서 새로고침 → 새 소식 띠
- 포인트·배지·출석 → 넣지 않음
남은 결정
| 항목 | 제안 |
|---|---|
| 무료 키워드 한도 | 3개 |
| 요약 모델·사건당 비용 상한 | 프로 가격 계산 전에 실측 |
| 너무 넓은 키워드 | 미리보기가 하루 200건 이상이면 "좁혀보세요" 안내 |
| 로그인 방식 | 카카오 · 구글 · 이메일 링크 중 선택 |
| 도메인 | keyon.io / keyon.co / keyon.news 재확인 후 구매 |
| API 키 | 네이버 개발자, DART, 공공데이터포털, 법제처, KIPRIS 발급 |