managarten/news/README.md

4.1 KiB

News Hub

A unified news reading platform combining AI-curated news with personal article saving capabilities.

Architecture

news/
├── apps/
│   ├── mobile/          # React Native/Expo App
│   └── api/             # NestJS Backend
├── packages/
│   ├── database/        # Drizzle ORM Schema
│   ├── shared/          # Shared utilities
│   └── browser-extension/  # Chrome Extension
└── docker/              # PostgreSQL Docker setup

Tech Stack

Component Technology
Database PostgreSQL 16 (Docker)
ORM Drizzle
Backend NestJS + Fastify
Auth Custom JWT Auth
Mobile React Native / Expo
State Zustand
Styling NativeWind (Tailwind)
Monorepo pnpm workspaces + Turborepo

Getting Started

Prerequisites

  • Node.js 20+
  • pnpm 9+
  • Docker Desktop

Setup

# 1. Install dependencies
pnpm install

# 2. Start PostgreSQL
pnpm docker:up

# 3. Push database schema
pnpm db:push

# 4. Start API server
pnpm dev:api

# 5. Start mobile app (in another terminal)
pnpm dev:mobile

Available Scripts

# Development
pnpm dev              # Start all services
pnpm dev:api          # Start API only
pnpm dev:mobile       # Start mobile app only

# Database
pnpm db:push          # Push schema to database
pnpm db:generate      # Generate migrations
pnpm db:migrate       # Run migrations
pnpm db:studio        # Open Drizzle Studio

# Docker
pnpm docker:up        # Start PostgreSQL
pnpm docker:down      # Stop PostgreSQL
pnpm docker:logs      # View logs

# Build
pnpm build            # Build all packages

Environment Variables

Create a .env file in the root directory:

# Database
DATABASE_URL=postgresql://news:news_dev_password@localhost:5432/news_hub

# API
API_PORT=3000
API_URL=http://localhost:3000

# Better Auth Secret
BETTER_AUTH_SECRET=your-secret-key

# Mobile App
EXPO_PUBLIC_API_URL=http://localhost:3000

Features

News Feed (AI-Generated)

  • Feed: Quick news updates with infinite scroll
  • Summaries: 4 daily summaries (morning, noon, evening, night)
  • In-Depth: Detailed analysis articles

Personal Library (Read Later)

  • Save articles from any URL
  • Browser extension for one-click saving
  • Content extraction with Readability
  • Archive and organize articles

API Endpoints

Auth

  • POST /auth/signup - Create account
  • POST /auth/signin - Sign in
  • POST /auth/signout - Sign out
  • GET /auth/session - Get current session

Articles

  • GET /articles - Get AI articles (public)
  • GET /articles/:id - Get single article
  • GET /articles/saved/list - Get saved articles (auth required)
  • POST /articles/:id/archive - Archive article
  • DELETE /articles/:id - Delete article

Content Extraction

  • POST /extract/save - Save article from URL (auth required)
  • POST /extract/preview - Preview URL extraction (public)

Categories

  • GET /categories - Get all categories

Users

  • GET /users/me - Get current user
  • PATCH /users/me - Update profile
  • PATCH /users/me/onboarding - Complete onboarding

Browser Extension

The browser extension is located in packages/browser-extension/.

Installation (Development)

  1. Go to chrome://extensions/
  2. Enable "Developer mode"
  3. Click "Load unpacked"
  4. Select the packages/browser-extension folder

Database Schema

Tables

  • users - User accounts and preferences
  • articles - All articles (AI-generated and user-saved)
  • categories - Article categories
  • user_article_interactions - Reading progress, ratings, bookmarks
  • sessions - Auth sessions
  • accounts - Auth providers
  • verifications - Email verification tokens

Development

Adding a new API endpoint

  1. Create service in apps/api/src/{module}/{module}.service.ts
  2. Create controller in apps/api/src/{module}/{module}.controller.ts
  3. Add module to app.module.ts

Adding a new database table

  1. Create schema in packages/database/src/schema/{table}.ts
  2. Export from packages/database/src/schema/index.ts
  3. Run pnpm db:push to update database

License

Private