FieldStation42 gives you two tools for controlling when content is eligible to play. The first is folder-based hints: names you give to subfolders that FieldStation42 reads at catalog-build time to determine availability windows. The second is meta_hints: a block in your station config that expresses the same rules as JSON, without touching your folder structure.
Both work on the same principle. Content that is outside its availability window is simply not added to the eligible pool when the scheduler runs. No config changes are needed at schedule-build time; you set the rules once and they apply automatically.
The same hint vocabulary also appears in a third place: the hint field of a marathon, which decides whether a marathon is allowed to trigger.
What Works Where
| Hint type | Folder name | meta_hints field |
Marathon hint |
|---|---|---|---|
| Month | October |
month |
"October" |
| Quarter | Q4 |
quarter |
"Q4" |
| Date range | December 1 - December 25 |
date_range |
"December 1 - December 25" |
| Day of week | friday |
day_of_week |
"friday" |
| Time of day | morning |
day_part |
— |
| Week number | week number 20 |
week_number |
"week number 20" |
| Custom holiday | thanksgiving |
custom_holiday |
"thanksgiving" |
Every hint type works everywhere except one: a marathon's slot already fixes the hour, so a time-of-day hint would tell it nothing.
meta_hints fields are more forgiving about capitalization than folder names, because naming the field already says which hint you mean. "month": "october" and "day_of_week": "Friday" both work, while folders named october/ or Friday/ match nothing.
Folder-Based Hints
Folder hints are the simplest option. Name a subfolder with a month, quarter, date range, time of day, day of the week, week number, or custom holiday, and FieldStation42 restricts that folder's contents to the matching window automatically.
Folder names are matched exactly, and each kind of name expects its own capitalization:
| Folder name | Casing | Example |
|---|---|---|
| Month | Capitalized | October |
| Day of week | Lowercase | friday |
| Quarter | Either | Q4 or q4 |
| Date range | Either | December 1 - December 25 |
| Week number | Either | week number 20 |
| Time of day | As named in your main config | morning |
| Custom holiday | As named in your main config | thanksgiving |
A folder whose name does not match any pattern is an ordinary folder with no restriction, so a capitalization mistake shows up as content that is always available rather than as an error.
Monthly
Name a subfolder after a month and its contents only play during that month:
catalog/retro_tv/
└── cartoons/
├── October/ <- Only plays in October
│ ├── halloween_special1.mp4
│ └── halloween_special2.mp4
└── December/ <- Only plays in December
├── xmas_special1.mp4
└── xmas_special2.mp4
Use the full month name (January, February, March, etc.). Abbreviations are not recognized.
Quarterly
Use Q1, Q2, Q3, or Q4 to restrict content to a three-month window:
catalog/retro_tv/
└── commercial/
└── Q4/ <- Only plays Oct through Dec
├── holiday_sale.mp4
└── winter_promo.mp4
| Name | Months |
|---|---|
| Q1 | January through March |
| Q2 | April through June |
| Q3 | July through September |
| Q4 | October through December |
Date Range
For more specific windows, name a folder with a date range:
catalog/retro_tv/
└── sitcoms/
└── December 1 - December 25/ <- Only plays Dec 1 through 25
├── xmas_ep1.mp4
└── xmas_ep2.mp4
Ranges wrap around the year boundary, so a winter season can be expressed as a single folder name:
November 15 - April 10/ <- Plays Nov 15 through Apr 10
Time of Day
Name subfolders after parts of the day to control what plays when. This is especially useful for commercials and bumps:
catalog/retro_tv/
└── commercial/
├── morning/ <- Only plays 6am to 10am
│ ├── breakfast_ad.mp4
│ └── coffee_ad.mp4
├── daytime/ <- Only plays 10am to 5pm
│ └── soap_ad.mp4
├── prime/ <- Only plays 5pm to 11pm
│ └── beer_ad.mp4
├── late/ <- Only plays 11pm to 2am
│ └── late_night_ad.mp4
└── overnight/ <- Only plays 2am to 6am
└── insomnia_ad.mp4
| Name | Hours |
|---|---|
morning |
6am to 10am |
daytime |
10am to 5pm |
prime |
5pm to 11pm |
late |
11pm to 2am |
overnight |
2am to 6am |
You can change these ranges in confs/main_config.json. The change applies across all channels. See Main Config Reference for details.
Day of Week
Name a subfolder after a day of the week and its content only plays on that day. Use all lowercase: monday, tuesday, wednesday, thursday, friday, saturday, sunday.
Combining Folder Hints
Folder hints stack by nesting. A commercial folder might have a morning subfolder, and inside that a December subfolder:
commercial/
└── morning/
└── December/
└── holiday_breakfast_ad.mp4
That ad only plays during December mornings. Here is how a fully hinted channel might look:
FieldStation42/
└── catalog/
└── family_channel/
├── cartoons/
│ ├── regular_toons/
│ ├── October/ <- Halloween specials
│ └── December/ <- Christmas specials
├── sitcoms/
│ ├── family_friendly/
│ └── November 15 - April 10/ <- Winter season content
├── commercial/
│ ├── morning/ <- 6am to 10am only
│ ├── daytime/ <- 10am to 5pm only
│ └── prime/ <- 5pm to 11pm only
└── bump/
├── pre/
└── post/
The regular and seasonal content coexist in the same tag folders. No schedule changes are needed; the scheduler filters automatically based on the current date and time.
Meta Hints
meta_hints lets you express the same availability rules inside your station config instead of in folder names. It is useful when:
- Your folders are already organized by show or type and you don't want to restructure them
- You want all of a channel's rules visible in one place
- You need to apply the same rule to multiple tags without creating matching folders for each
meta_hints is a top-level array inside station_conf:
{
"station_conf": {
"network_name": "Classic TV",
"channel_number": 4,
"content_dir": "catalog/classic",
"meta_hints": [
{ "tags": "holiday/halloween", "date_range": "October 15 - November 1"}
]
}
}
Each entry has a tags field and one or more conditions. Content in those tags is only eligible during the matching window.
An entry accepts these fields and no others:
| Field | Purpose |
|---|---|
tags |
Required. The tag or tags the entry applies to. |
month |
Restrict to a calendar month, such as October. |
quarter |
Restrict to Q1, Q2, Q3, or Q4. |
date_range |
Restrict to a date window. |
day_of_week |
Restrict to a weekday, such as friday. |
day_part |
Restrict to a part of the day. |
week_number |
Restrict to an ISO week. |
custom_holiday |
Restrict to a holiday named in main config. |
exclusive |
When the entry matches, exclude everything else. |
An unrecognized field name is rejected when the config loads, naming both the file and the field, so a typo fails at startup rather than quietly leaving content unrestricted.
Date Range
"meta_hints": [
{ "tags": "holiday/halloween", "date_range": "October 15 - November 1"}
]
The date range format is the same as for folder names. Ranges wrap around the year boundary:
{ "tags": "holiday/winter", "date_range": "December 1 - January 10"}
Time of Day
"meta_hints": [
{ "tags": "bumps/kids", "day_part": "morning"}
]
Day part names match the ones defined in your main config: morning, daytime, prime, late, overnight by default.
Combining Conditions
Specify both date_range and day_part in one entry to require both conditions simultaneously:
"meta_hints": [
{ "tags": "holiday/halloween", "date_range": "October 15 - November 1", "day_part": "late"}
]
Halloween content is only eligible during late-night hours within the October window. Outside that date range, or outside late hours, the tag is ignored.
Multiple Entries
Every entry whose tags cover a piece of content applies to it, and all of them must pass. Entries combine with AND, the same way multiple conditions inside a single entry do.
Tags match by path containment, so an entry on a parent folder also covers everything nested inside it. That is the usual way one file ends up under two entries:
"meta_hints": [
{ "tags": "bumps", "day_part": "morning"},
{ "tags": "bumps/kids", "date_range": "December 1 - December 25"}
]
Content in bumps/kids is covered by both entries, so it is eligible only on December mornings. Content elsewhere in bumps is covered by the first entry alone and is eligible every morning. Content outside bumps is covered by neither entry and is never restricted.
Because entries combine with AND, two entries on the same tag narrow it rather than widen it. A pair like "day_part": "morning" and "day_part": "daytime" on one tag can never be satisfied, since it asks for an hour that is in both windows at once. To widen a window, use a single entry with a day part that spans the range you want, or define a custom day part in your main config.
Tags as a List
A single entry can apply to multiple tags at once by passing an array:
"meta_hints": [
{ "tags": ["holiday/halloween", "seasons/autumn"], "date_range": "October 15 - November 1"}
]
Both folders enter the eligible pool under the same window. This is equivalent to two separate entries, one per tag.
The exclusive Flag
By default, a matching entry adds its content to the eligible pool alongside anything else that would normally be available. Setting "exclusive": true changes that: when the conditions match, only the hinted content is eligible for that content type. Everything else is excluded for that window.
"meta_hints": [
{ "tags": "bumps/kids", "day_part": "morning", "exclusive": true}
]
During morning hours, the scheduler pulls bumps exclusively from bumps/kids. The general bump pool is set aside until morning ends.
exclusive is most useful for themed blocks. A December holiday bump set with exclusive ensures nothing from the general bump folder surfaces in December. A late-night block with exclusive ensures daytime-style commercials never leak in after hours.
Week Numbers and Custom Holidays
Two further hint types cover windows the ones above cannot express: a specific ISO week of the year, and a named date you define yourself. Both work in all three places — as folder names, in meta_hints, and in a marathon hint.
Week Number
A week number restricts content to a single ISO week, numbered 1 through 53.
As a folder name, use the full phrase:
catalog/retro_tv/
└── promos/
└── week number 20/ <- Only plays during ISO week 20
└── sweeps_promo.mp4
In meta_hints, use the week_number field, which takes the number on its own:
"meta_hints": [
{ "tags": "promos/sweeps", "week_number": 20}
]
That field accepts 20, "20", and "week number 20" interchangeably. A marathon hint takes the full phrase:
{"tags": "sweeps", "marathon": {"chance": 1.0, "count": 4, "hint": "week number 20"}}
The phrase is case-insensitive, so week number 5, Week Number 5, and WEEK NUMBER 5 are equivalent, but the wording is fixed — week 5 does not parse. Values outside 1 to 53 are not recognized.
ISO weeks start on Monday, and week 1 is the week containing the first Thursday of January. The calendar year and the ISO week year therefore disagree at the boundary, which is worth knowing before pinning content to week 1 or week 53:
| Date | Day | ISO week |
|---|---|---|
| 2025-12-29 | Monday | 1 |
| 2026-01-01 | Thursday | 1 |
| 2026-01-05 | Monday | 2 |
| 2026-12-28 | Monday | 53 |
Week 1 content therefore starts playing on December 29 in 2025, not on January 1. Most years have only 52 ISO weeks, so week 53 content never plays at all in those years.
Custom Holidays
A custom holiday names a recurring date once in your main config so you can refer to it by name everywhere else. Define them in the custom_holidays block of confs/main_config.json:
{
"custom_holidays": {
"thanksgiving": "4th thursday november",
"christmas": "December 25",
"memorial_day": "last monday may",
"station_anniversary": "September 30"
}
}
Holiday values take one of two forms:
| Form | Pattern | Examples |
|---|---|---|
| Fixed date | <Month> <day> |
December 25, July 4 |
| Ordinal weekday | <1st\|2nd\|3rd\|4th\|last> <weekday> <month> |
4th thursday november, last monday may |
Values are case-insensitive, so 4th Thursday November and 4th thursday november both work. Month names must be spelled out in full; abbreviations are not recognized.
A fixed date means exactly that date. December 25 plays on the 25th whatever weekday it falls on, weekends included. An ordinal holiday always resolves inside its own month — 4th thursday november is Thursday, November 26 in 2026.
Once defined, use the name as a folder:
catalog/retro_tv/
└── specials/
└── thanksgiving/ <- Only plays on Thanksgiving
└── parade.mp4
in meta_hints:
"meta_hints": [
{ "tags": "specials/parades", "custom_holiday": "thanksgiving"}
]
or as a marathon hint:
{"tags": "parades", "marathon": {"chance": 1.0, "count": 8, "hint": "thanksgiving"}}
The holiday name is matched exactly, including case, in all three. A folder named Thanksgiving does not match a holiday defined as thanksgiving.
Holidays are defined globally rather than per channel, so every channel can use every name — and a folder matching one of those names is treated as a holiday folder in every catalog, not just the channel you had in mind.
A holiday name cannot be one that already means something else. Names like October, Q4, friday, morning, pre, week number 20, or anything shaped like a date range are rejected when main config loads, because folder names and marathon hints match a bare string and such a name would be ambiguous. Ordinary names like thanksgiving or station_anniversary are never affected.
When a Hint Is Not Recognized
A mistyped hint leaves content less restricted than you intended rather than more, so the three mechanisms report it differently.
meta_hints fails at startup. An unrecognized field name is rejected when the station config loads, naming both the file and the fields it expected. The field for a custom holiday is custom_holiday, so this entry stops the station rather than quietly carrying no condition:
{ "tags": "specials/parades", "holiday": "thanksgiving"}
A marathon hint logs a warning and carries on. Marathon hints live inside day templates and schedule overrides, so they are not checked when the config loads:
"hint": "thanksigving"
That marathon fires on its chance value alone, on any day of the year, and says so in the log.
A folder name that matches nothing is simply an ordinary folder. That is deliberate, since most folders are not hints — which makes this the one case with no signal at all. If content is available when you expected it to be restricted, check the folder name against the casing table above.
Choosing an Approach
Both approaches restrict eligibility using the same underlying mechanism. The choice comes down to how your content is organized and where you prefer to keep configuration:
| Folder hints | meta_hints |
|
|---|---|---|
| Setup | Rename or organize folders | Edit station config |
| Best for | Content organized by season or time | Content organized by show or type |
| Multiple tags | Each folder gets its own name | One entry can cover several tags |
| Rules visible in config | No | Yes |
| Requires catalog rebuild | Yes, when folders change | Yes, when tags change |
The two approaches can be combined freely. A folder hint handles one set of seasonal content; meta_hints handles another. The scheduler applies both sets of rules at the same time.
Complete Example
A channel that uses folder hints for its commercial library and meta_hints for show content and bumps:
{
"station_conf": {
"network_name": "Classic TV",
"channel_number": 4,
"content_dir": "catalog/classic",
"commercial_dir": "commercial",
"bump_dir": "bump",
"schedule_increment": 30,
"meta_hints": [
{ "tags": "holiday/halloween", "date_range": "October 15 - November 1"},
{ "tags": "holiday/christmas", "date_range": "December 1 - December 26"},
{ "tags": "bumps/morning", "day_part": "morning", "exclusive": true},
{ "tags": "bumps/primetime", "day_part": "prime", "exclusive": true},
{ "tags": ["bumps/kids", "commercial/kids"], "day_part": "morning", "date_range": "September 1 - June 15"}
],
"day_templates": {
"weekday": {
"7": {"tags": "cartoons"},
"12": {"tags": "movies"},
"20": {"tags": "sitcoms"}
}
},
"monday": "weekday",
"tuesday": "weekday",
"wednesday": "weekday",
"thursday": "weekday",
"friday": "weekday",
"saturday": "weekday",
"sunday": "weekday"
}
}
The commercial/ folder uses folder-based time-of-day hints internally:
catalog/classic/
└── commercial/
├── morning/ <- folder hint: 6am to 10am
├── prime/ <- folder hint: 5pm to 11pm
└── general/ <- no hint: available at all times
The meta_hints block then adds holiday show content during its respective windows, time-specific bumps with exclusive so the general bump pool does not bleed in, and school-year kids content during mornings from September through mid-June.