Tasty Tales
Build and manage rich, interactive recipes with features for searching, filtering, and discovering culinary content. Includes dynamic serving size calculators and interactive timers for a customized cooking experience.
Author

jmarcher
Quick Info
Actions
Tags
๐ฝ๏ธ TastyTales
A modern, feature-rich recipe platform built with Nuxt 3, Vue 3, and TailwindCSS. Perfect for culinary enthusiasts, food bloggers, and recipe creators.
Demo ยท Report Bug ยท Request Feature
๐ Support My Work
๐ Get Exclusive Access to Premium Content! ๐
Sponsor me on Patreon and get exclusive access to full Nuxt Apps with stunning designs,
components, and exclusive content!
โจ Features
Core Features
- ๐ Rich Recipe Management
- Step-by-step instructions
- Interactive timers with notifications
- Dynamic serving size calculator
- Ingredient management
- ๐จ Modern UI/UX
- Clean, minimalist design
- Smooth animations and transitions
- Responsive layout for all devices
- Dark mode support
- ๐ Search & Discovery
- Full-text search
- Category and tag filtering
- Recipe recommendations
๐งฉ Modules
TastyTales uses several Nuxt modules to enhance functionality:
- @nuxt/content v3 - File-based CMS
- @pinia/nuxt - State Management
- @nuxtjs/tailwindcss - CSS Framework
- @nuxtjs/google-fonts - Web Fonts
- nuxt-icon - Icon System
๐ Creating Content
Adding a New Recipe
- Create a new JSON file in
content/recipes/
with the following structure:
{
"title": "Classic Margherita Pizza",
"description": "Traditional Neapolitan pizza with fresh ingredients",
"image": "/images/recipes/margherita-pizza.jpg",
"prepTime": "15 minutes",
"cookTime": "12 minutes",
"servings": 4,
"difficulty": "medium",
"tags": ["italian", "pizza", "vegetarian"],
"ingredients": [
"Pizza dough",
"San Marzano tomatoes",
"Fresh mozzarella",
"Fresh basil",
"Olive oil",
"Salt"
],
"instructions": [
{ "instruction": "Preheat oven to 500ยฐF (260ยฐC)", "timer": 1 },
{ "instruction": "Roll out the pizza dough", "timer": 5 },
"Spread tomato sauce",
"Add fresh mozzarella",
"Bake for 12-15 minutes",
"Garnish with fresh basil"
]
}
Adding a Blog Post
- Create a new Markdown file in
content/blog/
with the following frontmatter:
---
title: 'The Art of Pizza Making'
description: 'Learn the secrets of making authentic Neapolitan pizza at home'
date: '2025-02-03'
image: '/images/blog/pizza-making.jpg'
author:
name: 'John Doe'
avatar: '/images/authors/john.jpg'
tags: ['tips', 'techniques', 'italian']
---
# The Art of Pizza Making
Your blog content goes here in Markdown format...
## Tips for Perfect Pizza
1. Use high-quality ingredients
2. Let the dough rest properly
3. Preheat your oven thoroughly
## Common Mistakes to Avoid
- Don't overload toppings
- Avoid using cold ingredients
- Don't skip the resting time
Working with Nuxt Content
Query your content in components/pages:
<script setup>
// Fetch all recipes
const { data: recipes } = await useAsyncData('recipes', () =>
queryCollection('recipes').all()
);
// Fetch a single recipe
const { data: recipe } = await useAsyncData('pizza', () =>
queryCollection('recipes')
.where('title', '=', 'Classic Margherita Pizza')
.first()
);
// Search recipes by tag
const { data: italianRecipes } = await useAsyncData('italian', () =>
queryContent('recipes').where('tags', 'LIKE', 'italian').all()
);
</script>
๐ Quick Start
Prerequisites
- Node.js 16.x or later
- pnpm 7.x or later
Installation
- Clone the repository
git clone https://github.com/florianjs/tasty-tales.git
cd tastytales
- Install dependencies
pnpm install
- Start development server
pnpm dev
- Build for production
pnpm build
๐ Project Structure
tastytales/
โโโ components/ # Reusable Vue components
โ โโโ recipe/ # Recipe-specific components
โ โโโ ui/ # UI components
โโโ composables/ # Composable functions
โโโ content/ # Recipe content (JSON/Markdown)
โโโ layouts/ # Page layouts
โโโ pages/ # Application routes
โโโ public/ # Static assets
โโโ stores/ # Pinia stores
โโโ types/ # TypeScript types
โโโ app.vue # Application entry
โโโ nuxt.config.ts # Nuxt configuration
โโโ tailwind.config.ts # TailwindCSS configuration
๐จ Customization
Theme
The default theme uses a warm, inviting color scheme:
colors: {
primary: colors.orange,
accent: colors.amber,
// Customize in tailwind.config.ts
}
Typography
- Headings: Playfair Display (elegant serif)
- Body: Inter (modern sans-serif)
Customize fonts in nuxt.config.ts
:
googleFonts: {
families: {
'Playfair+Display': [500, 600, 700],
'Inter': [400, 500, 600]
}
}
โ๏ธ Deployment
Recommended: Cloudflare Pages
This project is optimized for deployment on Cloudflare Pages, which provides:
- Global CDN distribution
- Automatic HTTPS
- Zero cold starts
- Easy deployment process
Deployment Steps
Basic deployment steps:
- Connect your repository to Cloudflare Pages
- Set build command:
pnpm run build
- Set build output directory:
.output/public
- Add a D1 SQL Database from Cloudflare
- Bind your database to your Cloudflare Page
For detailed deployment instructions, follow the Nuxt Content deployment guide for Cloudflare.
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- Nuxt.js - The Intuitive Vue Framework
- TailwindCSS - A utility-first CSS framework
- Pinia - The Vue Store that you will enjoy using
Made with โค๏ธ by 0xExile