◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Getting Started
◈ Getting Started/2026-03-24Beginner

Build a Meditation Timer App with Rork — Your First Mindfulness App from Scratch

Learn how to build a meditation timer app using Rork. This beginner-friendly guide walks you through creating a countdown timer, ambient sound playback, session history, and polished mindfulness UI.

Rork585meditation app3timermindfulnessbeginner21React Native239health

Why Build a Meditation App?

Health and wellness apps are one of the most consistently popular categories on both the App Store and Google Play. Meditation and mindfulness apps, in particular, offer an ideal combination for indie developers: the core features are straightforward to build, yet users tend to come back day after day.

Below, we build a meditation timer app from scratch using Rork. Even if you're relatively new to app development, Rork's AI assistant can help you get a functional app up and running in about 30 minutes to an hour.

What you'll learn:

  • How to implement a countdown timer with visual progress
  • Adding ambient sound playback during meditation sessions
  • Saving and displaying session history
  • Designing a calming, intuitive UI

Prerequisites and Setup

Before diving in, here's what you'll need.

Required:

Helpful but not required:

  • Basic understanding of app screen structure (home, settings, etc.)
  • Familiarity with React Native or Expo concepts (Rork handles most of it for you)

If you're brand new to Rork, check out the "Getting Started with Rork" guide first.

Designing the App — Planning Your Screens

The first step is mapping out what screens your app needs. When working with Rork, giving the AI a clear picture of the overall structure leads to much better results.

The Three Essential Screens

  1. Home Screen (Timer): The main countdown timer with start/pause/reset controls
  2. History Screen: A record of past meditation sessions
  3. Settings Screen: Timer duration presets, sound selection, and notification preferences

Sample Prompt for Rork

Type something like this into Rork's chat to get started:

Build a meditation timer app with the following features:
 
1. Home screen
   - Circular countdown timer with a progress ring
   - Preset buttons for 5, 10, 15, and 20 minutes
   - Start/pause/reset controls
   - Calm, dark blue color scheme
 
2. History screen
   - Session records with date, duration, and completion status
   - Weekly total meditation time summary
 
3. Settings screen
   - Custom timer duration input
   - End-of-session sound selection (bell, chime, or silent)
 
Use bottom tab navigation.
Color theme: calming dark navy + white.

With just this prompt, Rork will generate the screen layouts, navigation structure, and core components automatically.

Implementing the Countdown Timer

The timer is the heart of any meditation app. Let's look at how the core timer logic works, building on what Rork generates for you.

Core Timer Logic

// Timer state management (example of Rork-generated code)
import { useState, useEffect, useRef } from 'react';
 
const useMeditationTimer = (initialMinutes: number) => {
  const [timeLeft, setTimeLeft] = useState(initialMinutes * 60);
  const [isRunning, setIsRunning] = useState(false);
  const intervalRef = useRef<NodeJS.Timeout | null>(null);
 
  useEffect(() => {
    if (isRunning && timeLeft > 0) {
      intervalRef.current = setInterval(() => {
        setTimeLeft((prev) => prev - 1);
      }, 1000);
    } else if (timeLeft === 0) {
      // Timer completed
      setIsRunning(false);
      // Play completion sound
      // Save session record
    }
 
    return () => {
      if (intervalRef.current) clearInterval(intervalRef.current);
    };
  }, [isRunning, timeLeft]);
 
  // Format as MM:SS
  const formatTime = () => {
    const minutes = Math.floor(timeLeft / 60);
    const seconds = timeLeft % 60;
    return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
  };
 
  return { timeLeft, isRunning, setIsRunning, setTimeLeft, formatTime };
};

Circular Progress Ring

The visual progress ring is a key UI element for meditation apps. Ask Rork to "show the timer as a circular progress bar," and it will generate a react-native-svg implementation for you.

// Circular progress calculation
// progress: 0 (start) to 1 (complete)
const progress = 1 - (timeLeft / totalTime);
const circumference = 2 * Math.PI * radius;
const strokeDashoffset = circumference * (1 - progress);
// Apply to SVG circle element

Adding Ambient Sound Playback

Background sounds during meditation significantly enhance the user experience.

Follow-Up Prompt for Rork

Add ambient sound playback to the timer screen:
- Options: rain, ocean waves, birdsong, and silence
- Sound starts when the timer begins and stops when it ends
- Add a volume slider control
- Use expo-av for audio playback

Sound Playback Basics

// Ambient sound with expo-av (example of Rork-generated code)
import { Audio } from 'expo-av';
 
const sounds = {
  rain: require('../assets/sounds/rain.mp3'),
  waves: require('../assets/sounds/waves.mp3'),
  birds: require('../assets/sounds/birds.mp3'),
};
 
const playAmbientSound = async (soundKey: string) => {
  const { sound } = await Audio.Sound.createAsync(
    sounds[soundKey],
    {
      isLooping: true,    // Loop playback
      volume: 0.5,        // Default volume
    }
  );
  return sound;
};

With Rork, you can add audio features simply by asking — no need to manually configure audio sessions or handle platform-specific setup.

Saving and Displaying Session History

Tracking meditation history encourages users to stick with their practice and keeps them coming back to the app.

Storing Session Data

The simplest approach in a Rork-built app is using AsyncStorage for local persistence.

// Session data type
interface MeditationSession {
  id: string;
  date: string;           // ISO 8601 format
  duration: number;       // In seconds
  completed: boolean;     // Whether the session was completed
  soundUsed: string;      // Ambient sound selection
}
 
// Save a session
import AsyncStorage from '@react-native-async-storage/async-storage';
 
const saveSession = async (session: MeditationSession) => {
  const existing = await AsyncStorage.getItem('meditation_sessions');
  const sessions = existing ? JSON.parse(existing) : [];
  sessions.push(session);
  await AsyncStorage.setItem('meditation_sessions', JSON.stringify(sessions));
};

Building the History Screen

Ask Rork to refine the history display with a prompt like this:

Improve the history screen:
- Group sessions by date
- Show meditation duration and a completion icon for each session
- Display "Total meditation time this week" as a card at the top
- Add a streak badge showing consecutive days of practice

Streaks and weekly totals add a gamification element that can significantly improve retention. Users love seeing their consistency visualized.

Polishing the UI and UX

Meditation apps demand a calming visual design and intuitive interactions. Here are some refinements to consider.

Color Palette

A color palette that works well for mindfulness apps:

PurposeColorDescription
Background#0D1B2ADeep navy
Primary text#E0E1DDSoft white
Accent#415A77Muted blue
Progress ring#778DA9Light blue-gray
Start button#1B9AAATeal green

Animations

Adding gentle fade-in and fade-out animations when the timer starts and ends gives the app a more polished, meditative feel. Tell Rork something like "add a soft fade animation when the timer starts" and it'll handle the implementation.

Wrapping Up — From Meditation App to App Developer

A meditation timer is one of the best starter projects for new app developers. It's simple enough to build in a single session, yet it covers a wide range of fundamental skills: timers, local data storage, audio playback, and thoughtful UI design.

With Rork, you can go from an idea to a working prototype just by describing what you want. Start with the basics — a timer and a start button — then layer on features like ambient sounds, streaks, and session history as you get comfortable.

If you're ready to take your app's design to the next level, check out "Design Techniques for Higher-Quality Rork Apps" for more advanced tips.

Health and wellness apps enjoy steady demand and offer plenty of monetization paths. This meditation timer can be your first step toward building something people genuinely use every day.

Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

◈ Getting Started2026-09-14
Rork No Longer Creates New Expo Projects: Keep Yours, or Rebuild It in SwiftUI?
You can no longer start an Expo project in Rork, but existing ones keep building and shipping. Here is how to decide whether to stay on Expo or rebuild in SwiftUI, and what quietly goes missing when you rebuild.
◈ Getting Started2026-09-08
Whether You Need Rork Max Is Answered by Your Permissions, Not the Price Page
When I cannot decide between standard Rork and Rork Max, I stop reading the price page. Instead I pull every OS capability my app actually asks for out of app.json and Info.plist, then sort them into what Expo covers, what a config plugin covers, and what truly needs native Swift.
◈ Getting Started2026-08-17
Write .gitignore Before You Run git init on an Exported Rork Project
Running git init on a freshly exported Rork project puts your signing keys and .env straight into history. I measured what gets committed when the ignore file comes first versus last, and which exclusion patterns actually work.