Paul R Kartchner c2313c9464
Some checks failed
Basil CI/CD Pipeline / Code Linting (push) Successful in 58s
Basil CI/CD Pipeline / Web Tests (push) Successful in 1m11s
Basil CI/CD Pipeline / API Tests (push) Successful in 1m21s
Basil CI/CD Pipeline / Shared Package Tests (push) Successful in 57s
Basil CI/CD Pipeline / Security Scanning (push) Successful in 1m7s
Basil CI/CD Pipeline / Build All Packages (push) Failing after 1m20s
Basil CI/CD Pipeline / E2E Tests (push) Has been skipped
Basil CI/CD Pipeline / Build & Push Docker Images (push) Has been skipped
Basil CI/CD Pipeline / Trigger Deployment (push) Has been skipped
fix: update unit tests to match findUnique implementation
Changes to unit tests (meal-plans.routes.test.ts):
- Replace all findFirst mocks with findUnique mocks
- Update ownership verification tests to expect 403 (not 404) when
  accessing other user's meal plans
- Fix shopping list test to expect capitalized ingredient names (Flour not flour)

These changes align unit tests with the implementation changes from
the previous commit that fixed authorization to return 403 instead of 404.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-15 04:27:44 +00:00

Basil 🌿

A modern, full-stack recipe manager with web and mobile support. Import recipes from any URL, manage your recipe collection, and access them from anywhere.

Features

  • Recipe Import: Automatically import recipes from URLs using schema.org markup
  • Full Recipe Management: Create, read, update, and delete recipes
  • Rich Recipe Data: Store ingredients, instructions, prep/cook times, servings, images, and more
  • Search & Filter: Find recipes by title, cuisine, category, or tags
  • Multiple Images: Add multiple images to each recipe
  • Flexible Storage: Local filesystem storage by default, optional S3 support
  • Docker Support: Easy deployment with Docker Compose
  • API-First Design: RESTful API for web and future mobile apps

Tech Stack

  • Backend: Node.js, TypeScript, Express, Prisma ORM, PostgreSQL
  • Frontend: React, TypeScript, Vite, React Router
  • Infrastructure: Docker, Docker Compose, nginx
  • Monorepo: npm workspaces with shared types

Quick Start

Prerequisites

  • Node.js 20+
  • PostgreSQL 16+ (or use Docker)
  • Docker (optional, for containerized deployment)

Development Setup

  1. Clone the repository

    git clone <repository-url>
    cd basil
    
  2. Install dependencies

    npm install
    
  3. Set up environment variables

    cp packages/api/.env.example packages/api/.env
    # Edit packages/api/.env with your database credentials
    
  4. Start PostgreSQL (if not using Docker)

    # Create a database named 'basil'
    createdb basil
    
  5. Run database migrations

    cd packages/api
    npm run prisma:migrate
    npm run prisma:generate
    cd ../..
    
  6. Start development servers

    npm run dev
    

    This starts:

Docker Deployment

For production or easy local setup:

# Start all services
docker-compose up -d

# View logs
docker-compose logs -f

# Stop services
docker-compose down

Services will be available at:

Project Structure

basil/
├── packages/
│   ├── api/          # Backend API server
│   │   ├── prisma/   # Database schema and migrations
│   │   └── src/      # Express routes, services, config
│   ├── web/          # React web application
│   │   └── src/      # Components, pages, services
│   └── shared/       # Shared TypeScript types
├── docker-compose.yml
└── package.json      # Workspace root

Usage

Importing a Recipe

  1. Navigate to "Import Recipe" in the web app
  2. Paste a recipe URL (from sites like AllRecipes, Food Network, etc.)
  3. Preview the imported recipe
  4. Save to your collection

API Examples

Import recipe from URL:

curl -X POST http://localhost:3001/api/recipes/import \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/recipe"}'

Get all recipes:

curl http://localhost:3001/api/recipes

Create a recipe:

curl -X POST http://localhost:3001/api/recipes \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Chocolate Chip Cookies",
    "ingredients": [
      {"name": "flour", "amount": "2", "unit": "cups", "order": 0}
    ],
    "instructions": [
      {"step": 1, "text": "Preheat oven to 350°F"}
    ]
  }'

Configuration

Storage Options

Local Storage (Default):

STORAGE_TYPE=local
LOCAL_STORAGE_PATH=./uploads

S3 Storage:

STORAGE_TYPE=s3
S3_BUCKET=your-bucket-name
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=your-access-key
S3_SECRET_ACCESS_KEY=your-secret-key

Database

Default PostgreSQL connection:

DATABASE_URL=postgresql://basil:basil@localhost:5432/basil?schema=public

For external database services (AWS RDS, DigitalOcean, etc.), update the connection string.

Development

Commands

# Install dependencies
npm install

# Start all services in development mode
npm run dev

# Build all packages
npm run build

# Lint all packages
npm run lint

# Docker commands
npm run docker:up
npm run docker:down
npm run docker:build

Database Migrations

cd packages/api

# Create a new migration
npm run prisma:migrate

# Generate Prisma client
npm run prisma:generate

# Open Prisma Studio (GUI for database)
npm run prisma:studio

Future Enhancements

  • Mobile apps (React Native for iOS and Android)
  • User authentication and multi-user support
  • Recipe sharing and social features
  • Meal planning and grocery lists
  • Nutritional information calculation
  • Recipe scaling (adjust servings)
  • Print-friendly recipe view
  • Recipe collections and cookbooks

License

MIT

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Pipeline Test - 2026-01-14-23:05:33

Description
Basil is my recipe tracker
Readme 1.5 MiB
2026-01-20 04:38:55 +00:00
Languages
TypeScript 82.6%
CSS 11.8%
Shell 4.1%
JavaScript 0.9%
Python 0.4%
Other 0.2%