MyGo 云音乐
Go와 MyGo로 만든 서드파티 네이버 클라우드 뮤직 데스크톱 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
AI-powered news aggregation and summarization platform with a newspaper-inspired editorial UI. Fetches RSS feeds, summarizes them using LLM APIs, and presents everything in a clean, multi-column layout with real-time widgets.README 전문 보기 ↗AI-powered news aggregation and summarization platform with a newspaper-inspired editorial UI. Fetches RSS feeds, summarizes them using LLM APIs, and presents everything in a clean, multi-column layout with real-time widgets.
JOB_PROFILEBased on the "Mental Antibody" implementation spec and the "Engineering Cognitive Resilience" research paper. 57 features across 5 tabs:
Overview — Dashboard stats, quick actions, recent activity
Training
useOptimistic for instant feedbackAnalysis
Reflection
Reference
Bias Radar — 5-tab slide-over panel used across the app (from article views and homepage): technique picker, compare, decode, steelman, timeline, diet report, gut check
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Tailwind CSS 4, Vite, ShadCN UI, Recharts |
| Backend | Express 5, better-sqlite3 (WAL mode), rss-parser |
| AI | Groq (openai/gpt-oss-20b), OpenRouter (minimax/minimax-m2.7) |
| APIs | TMDB, CoinGecko, Open-Meteo, Frankfurter, Hacker News, PBS |
# Clone the repository
git clone https://github.com/elodlukacs/news-digest.git
cd news-digest
# Install server dependencies
cd server
npm install
cp .env.example .env
# Edit .env with your API keys (see Configuration below)
# Install client dependencies
cd ../client
npm install
Edit server/.env with your API keys:
# Required — at least one LLM provider
GROQ_API_KEY= # https://console.groq.com
OPENROUTER_API_KEY= # https://openrouter.ai
# Optional
TELEGRAM_BOT_TOKEN= # BotFather on Telegram
TELEGRAM_CHAT_ID= # Your chat ID
TMDB_API_KEY= # https://www.themoviedb.org/settings/api
DB_PATH= # SQLite path (default: ./newsreader.db)
PORT= # Server port (default: 3001)
# Access control — see "Securing a deployed backend" below
API_TOKEN= # Bearer token required on every endpoint except /api/health
ALLOWED_ORIGINS= # Comma-separated browser origins allowed to call the API
# Timeouts
LLM_TIMEOUT_MS= # Per-LLM-request timeout (default 90000)
RSS_TIMEOUT_MS= # Per-feed fetch timeout (default 15000)
Client (build-time only):
VITE_API_URL — backend URL for a split deployment (e.g. https://api.example.com/api). Omit only if the frontend host proxies /api to the backend.VITE_API_TOKEN — must match the server's API_TOKEN when auth is enabled.Running locally needs nothing: with API_TOKEN empty the API is open, and CORS
allows localhost only. As soon as the backend is reachable from anywhere
else, set both variables. Without a token, anyone who can reach the host can
delete categories, rewrite the system prompts that produce every summary, and
spend your LLM credits.
# server/.env
API_TOKEN=<a long random string>
ALLOWED_ORIGINS=https://your-frontend.example
# client build environment
VITE_API_TOKEN=<the same string>
GET /api/health stays unauthenticated so container health checks work. The API
also rate-limits: 300 requests/min per IP overall, 20/min on the LLM-backed
routes.
Prompts you edit in the /prompts UI survive restarts. On boot the server
re-seeds the prompts defined in server/db.js, but only for rows still
byte-identical to what it last wrote (tracked via prompts.source_hash).
Anything you have changed is left alone and listed in the startup log. To
deliberately adopt the code versions, run once with PROMPT_SEED_FORCE=1.
# Terminal 1 — Backend (port 3001)
cd server
node index.js
# Terminal 2 — Frontend (port 5173)
cd client
npm run dev
Open http://localhost:5173 in your browser.
# Type-check
cd client && npx tsc --noEmit
# Lint
cd client && npm run lint
# Production build
cd client && npm run build # outputs to client/dist/
+ button in the navigation bar (e.g., "World News", "Technology")JOB_PROFILE)news-reader/
├── client/ # React frontend
│ ├── src/
│ │ ├── components/ # UI components
│ │ │ ├── ui/ # ShadCN UI primitives
│ │ │ └── *.tsx # Page-level components
│ │ ├── features/
│ │ │ └── mindgames/ # Cognitive Resilience Dashboard (9 sub-modules)
│ │ │ ├── common/ # Shared: FeaturePanelHeader, TabHeader
│ │ │ ├── dashboard/ # CognitiveDashboard, CognitiveTabNav
│ │ │ ├── overview/ # OverviewTab (stats, quick actions)
│ │ │ ├── training/ # InoculationPanel, PatternTests
│ │ │ ├── analysis/ # ForensicPanel, StudyStressTester, CompareCoverage, NewsSpectrum
│ │ │ ├── reflection/ # ScientistPanel, BridgePanel, JournalTrends, InformationDiet, StressDiagnostic
│ │ │ ├── reference/ # PromptLibrary, NarrativeMapPanel, DisinfoMap
│ │ │ ├── quiz/ # DailyQuiz
│ │ │ └── bias-radar/ # BiasRadarPanel, TechniquePicker, TechniqueCard
│ │ ├── hooks/ # useApi, useTheme, useWidgets, useMediaQuery, usePullToRefresh
│ │ ├── types/ # TypeScript interfaces
│ │ ├── utils/ # Date formatting utilities
│ │ ├── config.ts # API_BASE configuration
│ │ └── index.css # Theme definitions (4 themes via CSS custom properties)
│ ├── vite.config.ts
│ └── components.json # ShadCN UI config
├── server/
│ ├── index.js # Express entry point
│ ├── db.js # SQLite setup (WAL mode, auto-creates tables)
│ ├── routes/ # API route handlers
│ │ ├── categories.js # CRUD for feed categories
│ │ ├── feeds.js # Feed management
│ │ ├── summaries.js # Summary generation + history
│ │ ├── chat.js # AI chat about summaries
│ │ ├── briefing.js # Morning briefing generation
│ │ ├── jobs.js # Job board (12 sources + AI filter)
│ │ ├── stats.js # LLM usage + trending
│ │ ├── widgets.js # Weather, crypto, rates, HN, releases
│ │ ├── homepage.js # Newspaper grid homepage
│ │ ├── settings.js # User preferences (theme, etc.)
│ │ ├── telegram.js # Send-to-Telegram
│ │ ├── discovery.js # RSS feed auto-discovery
│ │ ├── narrative.js # Narrative map
│ │ ├── prompts.js # Prompt library
│ │ ├── disinfo.js # Disinfo map
│ │ ├── cognitive.js # Stress diagnostic
│ │ ├── forensics.js # Fallacy detection
│ │ ├── inoculation.js # Inoculation game
│ │ ├── scientist.js # ADEPT debate + journal
│ │ ├── bridge.js # SOS audit
│ │ ├── compare.js # Coverage comparison
│ │ ├── spectrum.js # News spectrum
│ │ └── bias-radar/ # Bias radar (decode, related, timeline, daily-quiz, steelman, missing-story)
│ ├── lib/ # Shared utilities
│ │ ├── llm.js # LLM provider fallback (Groq → OpenRouter)
│ │ ├── rss.js # RSS parsing
│ │ ├── telegram.js # Telegram bot integration
│ │ └── fetchWithTimeout.js # HTTP with timeout
│ ├── jobs/ # Job aggregator
│ │ ├── sources.js # 11 aggregator fetchers + ALL_SOURCES registry
│ │ ├── sources-ats.js # Direct Greenhouse/Lever/Ashby/Workable boards
│ │ ├── profile.js # JOB_PROFILE — configurable role/seniority/region
│ │ ├── ai-filter.js # AI relevance filtering (reads JOB_PROFILE)
│ │ └── common.js # Shared job utilities
│ └── middleware/ # Express middleware
├── AGENTS.md # Agent instructions & architecture reference
└── vercel.json # Vercel deployment config
Both halves deploy independently. Whichever host you use, set API_TOKEN +
ALLOWED_ORIGINS on the server and VITE_API_TOKEN on the client — see
Securing a deployed backend.
.github/workflows/deploy-*.yml uses)Both client/Dockerfile and server/Dockerfile build standalone images; the
workflows SSH to the host and run ~/newsreader/deploy-frontend.sh /
deploy-backend.sh there.
DB_PATH=/data/newsreader.db
(already the image default). Health check hits /api/health.client/nginx.conf proxies /api/ to http://newsreader-api:3001,
so put both containers on the same Docker network and the default
VITE_API_URL=/api works with no build arg. If your backend container has a
different name, change the set $api_upstream line in client/nginx.conf.cd client && npm install && npm run buildclient/distVITE_API_URL to your backend URL, including the /api suffixvercel.json excludes api/ from the SPA rewrite. Without that exclusion the
rewrite matched /api/* too and every API call came back as 200 OK with an
HTML body — which surfaced as "Invalid response from server" rather than a
network error. The client now detects HTML responses on API requests and reports
the misconfiguration explicitly.
servernode index.jsPORT (most hosts provide it)/data), set DB_PATH=/data/newsreader.dbThe process handles SIGTERM/SIGINT by checkpointing the SQLite WAL and
closing the DB, so restarts don't leave an unflushed WAL behind.
MIT