A modern, user-friendly web application for managing time entries in the Intervals time tracking platform.
Version: 0.1 Credit: Rajesh Alda
✅ Easy to use - Modern web interface, no command line needed ✅ Multiple entries - Add many time entries at once ✅ Smart dropdowns - Select tasks and work types from dropdown (no ID lookup!) ✅ Flexible durations - Different time for each entry ✅ Date picker - Easy date selection ✅ Preview before submit - Review all entries before posting ✅ JSON import - Import from existing JSON files ✅ Real-time feedback - See success/error for each entry
pip install -r requirements.txtThis installs Flask, Flask-CORS, requests, and python-dotenv.
Create a .env file in the project root:
# Linux/Mac
cp .env.example .env
# Windows
copy .env.example .envEdit .env and add your API key:
INTERVALS_API_KEY=your_actual_api_key_hereGet your API key from: https://www.myintervals.com/api/
python web_app/app.pyBrowser will open automatically at http://127.0.0.1:5000
- Click "+ Add Entry" to add a new entry form
- Fill in:
- Date - Pick from calendar
- Work Type - Select from dropdown (e.g., India-Engineering, India-Meeting)
- Duration - Hours in decimal (1.5, 2.25, 8, etc.)
- Task - Select from dropdown (shows open tasks only)
- Description - What you worked on
- Billable - Check if billable
- Add more entries as needed
- Click "Preview" to review
- Click "Submit All Entries"
Click "Import JSON" and paste your JSON data. Supports multiple formats:
Getting Task IDs and Work Type IDs:
- Task IDs: Use Postman to call
https://api.myintervals.com/task?limit=20000- Headers:
Accept: application/jsonandAuthorization: Basic <username:password>(username = your API key, password = leave blank)
- Headers:
- Work Type IDs: See
data/all_worktypes.txtin the project - all work types with IDs are listed there
{
"task_id": "12345678",
"work_type_id": "305064",
"time": "8",
"entries": [
{"date": "2026-01-09", "description": "Daily standup"},
{"date": "2026-01-10", "description": "Team sync"}
]
}Or use friendly name instead of ID:
{
"task_id": "12345678",
"work_type": "India-Meeting",
"time": "8",
"entries": [
{"date": "2026-01-09", "description": "Daily standup"},
{"date": "2026-01-10", "description": "Team sync"}
]
}{
"task_id": "12345678",
"work_type_id": "304999",
"entries": [
{"date": "2026-01-09", "description": "Feature A", "time": "4"},
{"date": "2026-01-09", "description": "Bug fix", "time": "2"},
{"date": "2026-01-10", "description": "Code review", "time": "1.5"}
]
}{
"task_id": "12345678",
"entries": [
{
"date": "2026-01-09",
"work_type_id": "304999",
"time": "6",
"description": "Development"
},
{
"date": "2026-01-09",
"work_type_id": "305064",
"time": "2",
"description": "Client call"
}
]
}{
"entries": [
{
"date": "2026-01-09",
"task_id": "12345678",
"work_type_id": "305064",
"time": "2",
"description": "Standup",
"billable": false
},
{
"date": "2026-01-09",
"task_id": "12345678",
"work_type_id": "304999",
"time": "4",
"description": "Feature X",
"billable": true
},
{
"date": "2026-01-10",
"task_id": "12345678",
"work_type_id": "327235",
"time": "3",
"description": "Updated README"
}
]
}{
"task_id": "12345678",
"work_type_id": "304999",
"time": "8",
"entries": [
{
"date": "2026-01-09",
"description": "Regular dev work"
},
{
"date": "2026-01-10",
"description": "More dev",
"time": "6"
},
{
"date": "2026-01-10",
"description": "Meeting",
"work_type_id": "305064",
"time": "2"
}
]
}Top-level defaults (applied to all entries unless overridden):
task_id- Default task IDwork_typeorwork_type_id- Default work typetime- Default duration in hoursbillable- Default billable status (true/false)
Per-entry fields:
date- Required - Format: YYYY-MM-DDdescription- What you worked ontask_id- Override default taskwork_typeorwork_type_id- Override work typetime- Override duration (decimal: 1.5, 2.25, etc.)billable- Override billable status
- India-Meeting
- India-Engineering / Development
- India-Design
- India-Documentation
- India-Quality Assurance
- India-Project Management
- India-Training
- India-Customer Support
- India-Troubleshooting
You can use the work type name or ID.
interval-cheat/
├── web_app/ # Web application
│ ├── app.py # Flask backend
│ ├── static/
│ │ ├── css/ # Styles
│ │ └── js/ # Frontend logic
│ └── templates/ # HTML
│
├── core/ # API wrapper
│ ├── intervals_api.py
│ └── config.py # Environment config
│
├── cli_tools/ # Command-line tools (optional)
├── data/ # Sample data & examples
│ └── JSON_IMPORT_EXAMPLES.md
└── docs/ # Documentation
The .env file supports these settings:
# Required
INTERVALS_API_KEY=your_api_key_here
# Optional defaults
DEFAULT_TASK_ID=12345678
DEFAULT_PROJECT_ID=959242
DEFAULT_WORK_TYPE=India-MeetingIf you prefer command line:
Post single entry:
python cli_tools/post_time.py --task-id 12345678 --time 4 --description "Work done"Batch post from JSON:
python cli_tools/post_meeting_time.pyFind work types:
python cli_tools/find_worktype.py"INTERVALS_API_KEY not set"
- Make sure you created
.envfile (not.env.example) - Check that
INTERVALS_API_KEY=has your actual key - No quotes needed around the key
"Failed to load work types"
- Check your API key has correct permissions
- Verify you can access https://www.myintervals.com
Server won't start
- Run
pip install -r requirements.txtagain - Check if port 5000 is already in use
✅ API keys stored in .env file (never committed to Git)
✅ .gitignore already configured
✅ No hardcoded credentials in code
See data/JSON_IMPORT_EXAMPLES.md for 6 detailed JSON examples.
For detailed setup: docs/SETUP.md
For API reference: docs/intervals api endpoint.txt
See LICENSE file for details.