TimeToLeave
TimeToLeave is a comprehensive time-off management application designed to streamline vacation, sick leave, and work-from-home request handling for both employees and administrators. This tool helps organizations improve transparency and ensure compliance with internal policies.
🚀 Getting Started
These instructions will get you a copy of the project running on your local machine for development and testing purposes.
Prerequisites
- Node.js (version 20.x or higher recommended)
- npm/yarn (version 9.x or higher recommended)
Installation
-
Clone the repository:
git clone https://github.com/fegger/TimeToLeave.git cd TimeToLeave -
Install dependencies:
npm install -
Environment variables:
- For
apps/webandapps/mobile, copy.env.exampleto.envin each app directory and update the values as needed.
- For
🧱 Project Structure Overview
This project uses a monorepo setup to manage multiple, interconnected parts:
apps/: Contains the primary deployable applications.apps/web: The main web interface for the user, built using Next.js, React, and Tailwind CSS.apps/mobile: The mobile application client built using React Native and Expo.
packages/: Contains reusable, domain-specific logic and shared utilities.packages/core: Core business logic, domain models, and utilities like date manipulation using date-fns.packages/api-client: Handles interactions with the backend API, including authentication, request submissions, and calendar integration.
🛠 Development & Running the Application
The package.json defines several scripts to assist with development:
| Script | Command | Description |
|---|---|---|
dev |
npm run dev -w apps/web |
Starts the development server for the Web application. |
dev:mobile |
npm run start -w apps/mobile |
Starts the mobile client development server. |
build |
npm run build -w apps/web |
Builds the production bundle for the Web application. |
test |
npm run test -w apps/web |
Runs unit and integration tests for the Web application. |
lint |
npm run lint -w apps/web && npm run lint -w apps/mobile |
Runs linting checks across both web and mobile clients. |
Development Workflow Tip
When working on shared logic, modify files in packages/core or packages/api-client. Remember to run tests or restart the services to ensure changes are propagated correctly across the consuming apps.
📝 Web Application Overview
The web application is built with the following technologies:
- Framework: Next.js (version 16.2.6)
- UI Library: React (version 19.2.4)
- Styling: Tailwind CSS (version 4)
- Date Manipulation: date-fns (version 4.1.0)
- iCalendar Parsing: node-ical (version 0.26.1)
Key Features of the Web Client
- Dashboard for requesting and managing time off
- Real-time updates on approval status
- Integration with personal calendars via iCalendar
📱 Mobile Application Overview
The mobile application leverages the following technologies:
- Framework: React Native (version 0.81.5) via Expo (version 54.0.33)
- Navigation: React Navigation (version 7.2.4)
- Data Persistence: AsyncStorage (version 3.0.2)
- Device APIs: Expo modules for calendar, location, and notifications
Key Features of the Mobile Client
- Geolocation-based request policies
- Calendar event integration
- Native push notifications for status updates
🛡️ Testing & Quality Assurance
The project provides comprehensive scripts for maintaining code quality:
- Linting: Use
npm run lintto catch stylistic and structural errors. - Type Checking: Use
npm run typecheckto ensure type safety across the codebase. - Testing:
- The web application uses Vitest (version 4.1.5) for unit and integration tests.
- The mobile application uses Jest (version 29.7.0) for testing React Native components.
📄 API Documentation
The API client handles all interactions with the backend. The main features include:
- Authentication: Secure token management
- Request Management: Submitting and updating time-off requests
- Calendar Integration: Reading and writing calendar events
- Policy Checking: Validating requests against organizational rules
To use the API client, import it into your project:
import { createApiClient } from "@timetoleave/api-client";
const apiClient = createApiClient("YOUR_BACKEND_API_URL");
Detailed API documentation will be available once the backend services are finalized.
🤝 Contributing
Contributions are welcome! Please read CONTRIBUTING.md for more information.
📜 License
This project is licensed under the MIT License - see the LICENSE file for details.
📂 File Structure
├── apps/
│ ├── mobile/ # Mobile application using React Native and Expo
│ └── web/ # Web application using Next.js
├── packages/
│ ├── api-client/ # API client utilities
│ └── core/ # Shared core utilities and types
├── node_modules/ # Third-party dependencies
└── README.md # The file you're reading now
This README was generated based on the detected monorepo structure and dependencies.