Alarm Management¶
PoracleWeb provides a browser-based UI for managing Poracle notification filters. Users create alarms that tell Poracle which Pokemon, Raids, Quests, and other events to send as DM notifications.
All alarm CRUD operations are proxied through the PoracleNG REST API. PoracleNG handles field defaults, deduplication, and immediate state reload. See PoracleNG API Proxy for technical details.
Alarm types¶
| Type | Description |
|---|---|
| Pokemon | Filter by species, IV, CP, level, PVP rank, gender, size |
| Raids | Filter by raid boss, tier, move, evolution, EX eligibility, specific gym, RSVP changes |
| Eggs | Filter by egg tier, EX eligibility, specific gym, RSVP changes |
| Quests | Filter by reward type and Pokemon |
| Invasions | Filter by grunt type and shadow Pokemon |
| Lures | Filter by lure type |
| Nests | Filter by nesting Pokemon species |
| Gyms | Filter by gym team changes, battle activity, specific gym |
Creating alarms¶
Each alarm type has a dedicated page accessible from the sidebar navigation. The creation flow:
- Click the + (add) button
- Select the Pokemon/raid/quest target using the selector dialog
- Configure filter options (IV range, CP range, level, etc.)
- Set a distance — how far from your location to receive alerts (in meters)
- Optionally select a template for notification formatting
- Save the alarm
Alarm cards¶
Alarms are displayed as a card grid. Each card shows:
- Pokemon sprite or raid/quest icon
- Filter pills — Quick-glance badges showing active filters (IV, CP, Level, PVP, Gender, Size)
- Distance setting
- Template name
- Targeted gym name — Gym, Raid, and Egg alarm cards display the name of the targeted gym when a specific gym is selected (via the gym picker)
- Edit/delete actions
Bulk operations¶
Each alarm list page has a select mode toggle (checklist icon in the toolbar):
- Toggle select mode on
- Check individual alarms or use Select All
- The bulk toolbar appears with available actions:
- Update Distance — Set a new distance for all selected alarms
- Delete — Remove all selected alarms
Bulk distance uses the PoracleNG API
Bulk distance updates fetch all matching alarms from PoracleNG, modify the distance field, and POST them back. This ensures PoracleNG validates the data and triggers a state reload.
Profiles¶
Users can maintain multiple alarm profiles. Only one profile is active at a time.
- Switch profiles from the Profiles page or the user menu
- Each alarm is associated with a
profile_no - The active profile is tracked by
humans.current_profile_no
Pokemon alarm filters¶
Size filter¶
The size filter uses special sentinel values:
size = -1— No filter (ALL sizes). This is the default.size = 1throughsize = 5— Specific sizes: 1 = XXS, 2 = XS, 3 = Normal, 4 = XL, 5 = XXL.max_size = 5— Default upper bound.
When a user selects a specific size, both size and max_size are set to the same value, creating an exact match. For example, selecting XXL sets size = 5, max_size = 5.
Level range¶
The default maximum level is 55 (not 40 or 50), matching Poracle's support for shadow/purified/best-buddy boosted levels.
Raid alarm filters¶
Raid alarms support these fields beyond the basic tier/boss selection:
| Field | Default | Description |
|---|---|---|
team |
4 (any team) |
Gym team controlling the raid |
move |
9000 (any move) |
Filter by raid boss move |
evolution |
9000 (any) |
Filter by evolution type (e.g., Mega, Primal) |
exclusive |
false |
EX/exclusive raid flag |
gymId |
null (all gyms) |
Track a specific gym by ID (set via gym picker) |
rsvpChanges |
false |
Receive RSVP change notifications |
Egg alarm filters¶
Egg alarms support:
| Field | Default | Description |
|---|---|---|
team |
4 (any team) |
Gym team controlling the egg |
exclusive |
false |
EX/exclusive egg flag |
gymId |
null (all gyms) |
Track a specific gym by ID (set via gym picker) |
rsvpChanges |
false |
Receive RSVP change notifications |
Gym alarm filters¶
Gym alarms support:
| Field | Default | Description |
|---|---|---|
team |
4 (any team) |
Gym team to track |
battleChanges |
false |
Notify on battle activity changes at the gym |
gymId |
null (all gyms) |
Track a specific gym by ID (set via gym picker) |
GymCreate.Team default
GymCreate.Team must default to 4 (any team), matching Raid and Egg defaults. A C# int defaults to 0, which maps to "Neutral only" in Poracle, causing new gym alarms to silently filter out all non-Neutral gyms.
Gym picker¶
The gym picker is a shared component (app-gym-picker) that allows users to optionally target a specific gym when creating or editing Gym, Raid, or Egg alarms. When a gym is selected, alerts only fire for events at that particular gym.
How it works¶
- The picker displays a search field labeled "Search for a gym (optional)".
- As the user types (minimum 2 characters), the component debounces input (300ms) and queries the scanner database via
GET /api/scanner/gyms?search=<term>&limit=20. - Results appear in an autocomplete dropdown. Each option shows:
- Gym photo thumbnail (from the scanner DB), or a team icon fallback if no photo is available
- Gym name (or gym ID if the name is not set)
- Area name — resolved by checking which Koji geofence polygon contains the gym's coordinates (via point-in-polygon), or lat/lon coordinates if no area matches
- Selecting a gym sets the
gymIdon the alarm. A compact chip displays the selected gym's photo, name, and area with a clear button to remove the selection. - In edit mode, the picker loads the existing gym's details from
GET /api/scanner/gyms/{id}to display the name and photo.
Requirements¶
- The scanner database must be configured (
ConnectionStrings:ScannerDb). If not configured, theIScannerServiceis not registered and the search endpoints return empty results. - The Koji service is optional. When available, it enriches results with area names by checking gym coordinates against Koji geofence polygons.
Backend¶
ScannerControllerexposesGET /api/scanner/gyms(search) andGET /api/scanner/gyms/{id}(lookup by ID).IScannerService.SearchGymsAsync()queries the scanner DB's gym table by name (LIKE match), returningGymSearchResultwithId,Name,Url,Lat,Lon,TeamId, andArea.- Area enrichment runs server-side: for each gym result, the controller iterates Koji admin geofences and assigns the first matching fence name.
Invasion alarm filters¶
Invasion alarms filter by grunt type. The grunt_type value is automatically lowercased on create because Poracle uses case-sensitive matching for grunt types.
Default values¶
Comprehensive table of all monster (Pokemon) alarm defaults, matching the PHP PoracleWeb defaults:
| Field | Default | Description |
|---|---|---|
min_iv |
0 |
Minimum IV percentage |
max_iv |
100 |
Maximum IV percentage |
min_cp |
0 |
Minimum CP |
max_cp |
9000 |
Maximum CP |
min_level |
0 |
Minimum level |
max_level |
55 |
Maximum level |
min_weight |
0 |
Minimum weight |
max_weight |
9000000 |
Maximum weight |
atk |
0 |
Minimum attack IV |
def |
0 |
Minimum defense IV |
sta |
0 |
Minimum stamina IV |
max_atk |
15 |
Maximum attack IV |
max_def |
15 |
Maximum defense IV |
max_sta |
15 |
Maximum stamina IV |
pvp_ranking_best |
0 |
Best PVP ranking position |
pvp_ranking_worst |
4096 |
Worst PVP ranking position |
gender |
0 |
Gender filter (0 = any) |
size |
-1 |
Size filter (-1 = no filter / all sizes) |
max_size |
5 |
Maximum size upper bound |
Raid-specific defaults:
| Field | Default |
|---|---|
team |
4 (any team) |
move |
9000 (any move) |
evolution |
9000 (any evolution) |
Egg-specific defaults:
| Field | Default |
|---|---|
team |
4 (any team) |
Gym-specific defaults:
| Field | Default |
|---|---|
team |
4 (any team) |
Quick Picks¶
Admins can define Quick Pick templates — pre-configured alarm sets that users can apply with one click. Useful for onboarding new users or sharing recommended configurations.