π Secure Authentication via Firebase Auth with
π Google Analytics v4 integration for user behavior insights
π Create & Manage Recipes (Homemade or External Links)
π·οΈ Custom Tag System for easy organization
π Internationalization with English & Hebrew support
π± Responsive Design for all devices
π₯ Rate Limit Detection with global fetch interceptor
βοΈ Image Upload via Firebase Storage
β Favorite Recipes for quick access
π¨ Light/Dark Mode with user preference persistence
π§ Smart Tag Translation using Azure Cognitive Services
π Dual-Language Tags with English & Hebrew fallback
π‘ Suggest Tags with admin approval workflow
π‘οΈ App Integrity protection with Firebase App Check (reCAPTCHA v3)
πΎ Persistent User Preferences stored via localStorage
You can even suggest new tags for recipes, which admins can review and approve!
Recipe Keeper is a full-stack monorepo built with Next.js, Firebase, and Express:
recipe_keeper/
βββ client/ # Frontend (Next.js + Chakra UI)
β βββ out/ # Static export for Firebase Hosting
βββ functions/ # Backend (Express + Firebase Admin)
β βββserviceAccountKey.json # Private Firebase Admin key
βββ firebase/ # Firebase configuration
β βββ firestore.rules
β βββ firestore.indexes.json
β βββ storage.rules
βββ .firebaserc
βββ firebase.json
βββ PRIVACY.md
βββ README.md
βββ LICENSE
βββ package.json # Root scripts and shared configs
# Install dependencies
npm install # Root level dependencies
cd functions && npm install
cd ../client && npm install
# Start development servers
npm run dev # Runs frontend and backend concurrently
npm run build # Build both client and server
npm run deploy # Deploy to Firebase (hosting + functions)
Frontend
Backend
Infrastructure
Next.js
TypeScript
Chakra UI v3
Tailwind CSS
i18next
Express.js
Firebase Admin SDK
Node.js
Firebase Authentication
Firebase Firestore
Firebase Storage
Firebase Hosting
Firebase Functions
Azure Cognitive Services (Translator API)
Google Analytics v4
Firebase App Check (reCAPTCHA v3)
localStorage (for storing filter and UI preferences)
π Authentication Required for most of Endpoints
Method
Endpoint
Description
GET
/recipes
Get paginated list of recipes (public or private based on type param)
GET
/recipes/:id
Get single recipe by ID (if public or owned by user)
POST
/recipes
Create a new recipe (requires authentication)
PATCH
/recipes/:id
Update a recipe (requires authentication and ownership)
DELETE
/recipes/:id
Delete a recipe (requires authentication and ownership)
GET
/recipes/user/:uid
Get all public recipes from a specific user
/recipes Query Parameters
Parameter
Type
Description
type
public | private
Required . Determines recipe visibility scope (public or user-only)
favorites
true
Optional. If set, filters results to only the user's favorite recipes
page
number
Optional. Page number for pagination (default: 1)
pageSize
number
Optional. Number of results per page (default: 10)
recipeType
link | homemade | all
Optional. Filter by type of recipe
kosher
true
Optional. Only return kosher recipes
tags
comma-separated list
Optional. Filter recipes that include all listed tag IDs
visibility
public | private
Optional. Only for type=private, filters user's recipes by visibility
search
string
Optional. Full-text search in title
Method
Endpoint
Description
POST
/recipes/upload-photo
Upload photo to a recipe
GET
/recipes/get-photo-url/:recipeId
Get signed image URL
DELETE
/recipes/delete-photo/:recipeId
Delete image from Storage
Method
Endpoint
Description
GET
/favorites/:id
Check if recipe is favorited
POST
/favorites/:id
Add recipe to favorites
DELETE
/favorites/:id
Remove recipe from favorites
Method
Endpoint
Description
POST
/profile/upload-photo
Upload profile photo
DELETE
/profile/remove-photo
Remove profile photo
GET
/settings/color-mode
Get stored color mode
POST
/settings/color-mode
Save preferred color mode
GET
/settings/language
Get user language setting
POST
/settings/language
Save language preference
Method
Endpoint
Description
GET
/tags
Get global tag list
POST
/tags
Add tag (admin only)
DELETE
/tags/:tagName
Remove tag (admin only)
POST
/tags/suggest
Suggest a new tag (authenticated)
GET
/tags/suggestions
Get all tag suggestions (admin only)
GET
/tags/suggestions/user
Get current user's tag suggestions
PATCH
/tags/suggestions/:docId/status
Update suggestion status (admin only)
Page Name
Description
Access
Key UI Features
Home
Displays public recipes with filtering and sorting options.
Public
Search bar, tag filters, recipe type filters, pagination
My Recipes
Dashboard for managing userβs own recipes (add, edit, delete).
Authenticated Users
Recipe list, visibility toggle, add new recipe button
Favorites
Quick access to recipes the user has marked as favorite.
Authenticated Users
Heart icons, favorite-only filtering, recipe quick view
Recipe View
Full detail view of a specific recipe.
Public or Private
Title, description, ingredients, instructions, rating, tags
Recipe Editor
Used to create or edit a recipe (homemade or link).
Authenticated Users
Form with image upload, ingredients, steps, rating, tags
Tag Management
Admin panel for managing global tags and their translations.
Admin Only
Tag list, add/delete tag, multi-language support
User Profile
View a specific user's public profile and their shared recipes.
Public
Avatar, display name, bio, public recipe list
Settings
Manage personal preferences and app behavior (language, theme, etc.).
Authenticated Users
Avatar upload, bio edit, email/password update, switches
Suggest Tag
Allows users to suggest new tags with translation support.
Authenticated Users
Suggestion form, input validation, dual-language fields
Tag Suggestions Review
Admin view for reviewing and approving user tag suggestions.
Admin Only
Status filters, approve/reject actions, metadata view
404 Page
Shown when navigating to a route that doesn't exist.
Public
Custom error message, return to home link
π¦ Firestore & Storage Collections
users/{uid}/public/profile # Public user info (displayName, bio, photoURL, etc.)
users/{uid}/private/settings # Private user preferences (language, dark mode, notifications, etc.)
recipes/{recipeId} # All recipe metadata, including title, type, visibility, tags, rating, etc.
global/tags # List of all approved tags with translations
tagSuggestions/{docId} # User-submitted tag suggestions with translation fields and status
slugs/{slug} # Public user slugs mapping to user UID (used for profile URLs)
π Firebase Storage Buckets (Structured Uploads)
/recipes/{recipeId}/photo.jpg # Recipe photo uploads
/users/{uid}/profile.jpg # User profile images
π Privacy & Data Policy
RecipeKeeper stores only the data required to provide its core features. Recipes can be marked as public or private . Only public recipes are viewable by other users.
When sharing external recipe links , RecipeKeeper stores the link but does not host or claim ownership of third-party content . If you are the owner of linked content and want it removed, please contact us.
All data is stored securely via Firebase and protected by Firebase Authentication.
View the full Privacy Policy .
Licensed under the MIT License
Β© Recipe Keeper Project Contributors