Prerequisites
Your university must provide calendar data in one of these formats:
- ICS feed URLs (most common)
- CELCAT/ADE planning systems
- Custom calendar exports
Planning JSON structure
Planning files are stored inresources/plannings/ as JSON files. Each file represents one institution.
Basic structure
Field definitions
Display name of the institution or group.
Top-level grouping (usually city or region). Only used at the root level.
Unique identifier within the parent. Must be:
- Lowercase
- No spaces (use hyphens)
- URL-safe characters only
first-year-group-aICS calendar feed URL. Only present on leaf nodes (actual plannings).Supported URL formats:
- Direct ICS URLs:
https://example.com/calendar.ics - CELCAT .shu URLs:
https://planning.example.com/jsp/custom/modules/plannings/abc123.shu - Template URLs with date ranges:
https://example.com/export.ics?start={date-start}&end={date-end}
Nested sub-groups or plannings. Can be nested arbitrarily deep.
Real-world example
Here’s a simplified excerpt fromenscr.json:
Full ID format
Internally, PlanningSup creates afullId by joining all parent IDs:
Adding your university
Find ICS URLs
Locate your university’s planning system. Common systems:
- CELCAT - Look for
.shuexport URLs - ADE - Check for ICS export options
- Custom systems - Contact IT department
Create JSON file
Create a new file in
resources/plannings/ named after your institution:Use lowercase with hyphens:
university-of-example.jsonStructure your data
Organize plannings hierarchically. Common structures:
- By department
- By year
- By program
Validate JSON
Run the validation script:This checks for:
- Valid JSON syntax
- Required fields
- Unique IDs
- Valid URL formats
Test locally
Start the development server:Navigate to
http://localhost:4444 and:- Find your university in the planning selector
- Select a planning group
- Verify events load correctly
- Check that event details are accurate
Helper scripts
PlanningSup includes scripts to automate URL generation for certain systems.SHU generator (CELCAT)
If your university uses CELCAT withresources=123 URLs, use the SHU generator:
- Reads your JSON file
- Extracts project IDs from
resources=123URLs - Calls the CELCAT API to generate
.shuURLs - Replaces URLs in place
- Creates a
.backupfile
CELCAT fetch
For bulk CELCAT planning discovery:Advanced URL features
Date range templates
Some systems require date ranges in the URL. Use template variables:{date-start}- Start date (default: 1 month ago){date-end}- End date (default: 2 years in the future)
?from= and ?to= query parameters:
Best practices
Organizing plannings:
- Keep hierarchy shallow (3-4 levels max)
- Use clear, descriptive titles
- Group logically (by department, year, or program)
- Avoid duplicate IDs at any level
- Test all URLs before submitting
Troubleshooting
Events not loading
Check that:- URL returns valid ICS data (test in browser)
- URL is publicly accessible (no authentication required)
- ICS format is valid (use an ICS validator)
Duplicate IDs error
Ensure allid fields are unique within their parent:
Validation fails
Run the validator for detailed error messages:- Missing required fields (
id,title) - Invalid JSON syntax (trailing commas, missing quotes)
- Invalid URL format
Examples from existing universities
Study these files for inspiration:enscr.json- Complex nested structure with multiple levelsfac-de-sciences.json- Simple department-based organizationesir.json- Year-based grouping
Getting help
If you need assistance adding your university:- Open an issue on GitHub with your planning structure
- Contact @kernoeb on Telegram or Discord
- Check existing PRs for similar universities
The maintainer can help you structure your data or troubleshoot URL issues.
After your PR is merged
Once your pull request is merged:- Your university appears in the next release
- Users can select your plannings from the UI
- Events are automatically backed up to the database
- Background jobs keep data fresh