This repository contains a self-hosted recipe web application implemented in Ruby On Rails.
Runtime docker images are available.
- Ruby 3.4+
- PostgreSQL
- ImageMagick
- Tesseract OCR
- Redis (required for Sidekiq background jobs)
- Recommended: Redis 6+
- Start locally:
docker run --rm -p 6379:6379 redis:6
- Recipe management with images and OCR text recognition
- AI-powered recipe extraction with two methods:
- Mistral + OpenAI: Image → Mistral OCR (markdown) → OpenAI parsing (structured recipe)
- OpenAI Direct: Image → OpenAI (structured recipe)
- AI-powered OCR text cleanup using GPT-4 Mini
- Multiple recipes detection from single image
- Tagging and search functionality
- Auth0 authentication
- AWS S3 file storage
- Responsive UI with Tailwind CSS
rake db:create
rake db:migrate
Restore dump
pg_restore -d reeper_development -h db -Upostgres file.dump
Create .env.local file with AWS credentials
# .env.local
AWS_ACCESS_KEY_ID=AAAAAAA
AWS_SECRET_ACCESS_KEY=BBBBBFor the AI-powered recipe extraction and OCR cleanup features, configure your OpenAI API key:
Development:
# Option 1: Environment variable (recommended)
export OPENAI_API_KEY=your_openai_api_key_here
# Option 2: Rails credentials
EDITOR="code --wait" rails credentials:edit
# Add: openai_api_key: your_openai_api_key_hereProduction/Dokku:
dokku config:set your-app-name OPENAI_API_KEY=your_actual_openai_api_key_here
# Optional: Override cleanup prompts per language
dokku config:set your-app-name OPENAI_CLEANUP_PROMPT_EN="Your custom English prompt..."
dokku config:set your-app-name OPENAI_CLEANUP_PROMPT_DE="Your custom German prompt..."Optional Configuration:
OPENAI_CLEANUP_PROMPT_EN: Override the default English cleanup promptOPENAI_CLEANUP_PROMPT_DE: Override the default German cleanup promptOPENAI_PROMPT_OCR_ID: Override the default OpenAI prompt ID for direct OCR (default:pmpt_694514e453388194a1e4c121407ef02204bec5d20e21b070)OPENAI_PROMPT_OCR_VERSION: Override the default OpenAI prompt version for direct OCR (default:2)OPENAI_MARKDOWN_PROMPT_ID: Override the default OpenAI prompt ID for markdown parsing (default:pmpt_696554b87ef88190bbc1156b6c5fe84f0050d5451e60ae6c)OPENAI_MARKDOWN_PROMPT_VERSION: Override the default OpenAI prompt version for markdown parsing (default:2)
For the Mistral + OpenAI two-phase recipe extraction, configure your Mistral AI API key:
Development:
export MISTRAL_API_KEY=your_mistral_api_key_hereProduction/Dokku:
dokku config:set your-app-name MISTRAL_API_KEY=your_actual_mistral_api_key_hereNote: The Mistral API key is only required if you plan to use the "Mistral + OpenAI" recognition method. The "OpenAI Direct" method only requires the OpenAI API key.
Start dev-server, css build, js build
bin/dev
yarn build:css --watch
yarn build --watch
Use provided docker-compose.prod.yml file for startup of postgres db and container for the rails app. Don't forget to set the following environment variables:
Required:
AWS_ACCESS_KEY_ID: AWS access keyAWS_SECRET_ACCESS_KEY: AWS secret keyOPENAI_API_KEY: OpenAI API key for AI recipe extraction- Database passwords
Optional:
MISTRAL_API_KEY: Mistral AI API key (only needed for "Mistral + OpenAI" method)S3_BUCKET_NAME: Override S3 bucket name (default: reeper)S3_BUCKET_REGION: Override S3 region (default: eu-central-1)OPENAI_PROMPT_OCR_ID: Custom OpenAI prompt ID for direct OCROPENAI_PROMPT_OCR_VERSION: Custom OpenAI prompt versionOPENAI_MARKDOWN_PROMPT_ID: Custom OpenAI prompt ID for markdown parsingOPENAI_MARKDOWN_PROMPT_VERSION: Custom OpenAI prompt version