Signal Hill & Lion's Head - Cape Town - Updated 2026-05-20
SigsSafe covers two Cape Town paragliding sites — Signal Hill and Lion's Head — from one app.
Signal Hill uses three PgSonda sensors: BACK (behind the hill, authoritative), FRONT (at launch), and SEAPOINT (landing zone).
Lion's Head uses two sensors: LH UPPER at the launch (Holfuy) and GLEN CLUB at the landing (GlenWind). A sixth sensor, LH LOWER, is planned.
Each site has its own live display, log, and status. The app evaluates each site independently and displays:
FLYABLE ·
FLYABLE WITH CAUTION ·
MANUAL CHECK ·
UNSAFE
All six sensors write into a shared database. This makes it possible to review history, compare sensors across sites, and test safety rules against real past conditions before activating them.
Important: MANUAL CHECK does not mean “don't fly.” It means sensors are degraded — use visual assessment, a handheld anemometer, or ask a current pilot before deciding. The app cannot make that call for you.
Redundancy: a separate live wind feed is available at stations.systemic.co.za ↗ — cross-check it when SigsSafe is in MANUAL CHECK or when you want a second opinion.
Collective decision-making: SigsSafe shows the same data to all pilots on site. If experienced pilots on the ground are seeing different conditions, trust the site consensus over any single reading. The app is a tool — not a replacement for pilot judgement and shared observation.
Pilot warnings: Tandem pilots can log field observations (turbulence, sink, rotor, unsafe vote) directly in the app. Warnings are timestamped, stored in the database, and shown to other pilots for up to 10 minutes. The 3-vote unsafe system can be activated or deactivated by site management.
| Card | Station ID | Role |
|---|---|---|
| BACK — Tower | signalhill | Primary. Behind the hill at mast height. Authoritative for overall status. |
| FRONT — Launch | lionsheadlower | At launch. Cross-checks when BACK is offline. Cannot override BACK. |
| SEAPOINT | seapoint | Marine layer / sea breeze indicator. Protects landing zone. Early warning for building westerlies. |
All three Signal Hill sensors are hosted on pgsonda.cz. Readings are fetched directly from PgSonda every 10 seconds and also written to the Supabase database for history.
| Card | Source | Role |
|---|---|---|
| LH UPPER | Holfuy station 1724 | At the launch in the venturi. Updates every 2 minutes. Primary LH launch reference. |
| GLEN CLUB | GlenWind API | At the landing zone. Updates every 5 minutes on the clock. Confirms landing conditions and provides early warning of wind shifts. |
| LH LOWER | PgSonda (planned) | Future sensor — offline placeholder. Will add an intermediate reference between launch and landing. |
LH Upper and Glen Club readings are written to Supabase by the Netlify poller. The browser reads the latest values from Supabase. Glen Club uses a Davis 6410 wind sensor with a 5-minute averaging window — lull, average, and gust are all recorded.
Evaluated in priority order — first matching rule wins. “Recent” means the sensor reported within the last 3 minutes.
| # | BACK | SEA | FRONT (last 10 min) | Result |
|---|---|---|---|---|
| 1 | Any sensor in a RED zone (speed exceeds zone limit) | 🔴 UNSAFE | ||
| 2 | Recent · green | Recent · green | Recent · all green | ✅ FLYABLE |
| 3 | Recent · green/yellow | Recent · green/yellow | Any green/yellow reading | 🌡 CAUTION · ALERT |
| 4 | Stale / offline | Recent · green/yellow | All green/yellow · no R004 in last 10 min | 🌡 CAUTION — B-Stale/Offline |
| 5 | Stale / offline | Recent | R004 (over the back) reading in last 10 min | ⚠ MANUAL — F-Backwind |
| 6 | Recent | Recent | Stale / offline | ✅ FLYABLE — F-Offline (noted) |
| 7 | Recent | Stale / offline | — | ⚠ MANUAL — S-Offline · use handheld |
| 8 | Stale / offline | Stale / offline | — | ⚠ MANUAL — B+S offline · visual check required |
Pilot vote override (3 net “unsafe” votes in database) can elevate any status to UNSAFE. See Section 14.
| Status | Meaning | Action |
|---|---|---|
| ✅ FLYABLE | All active sensors green, no alert conditions | Normal operations |
| 🌡 CAUTION · ALERT | Yellow zone or Promenade Wall turbulence active | Heightened awareness; consider waiting |
| 🌡 CAUTION | BACK offline, but FRONT confirms flyable conditions | Fly with extra vigilance; BACK may recover |
| ⚠ MANUAL | Sensors degraded or ambiguous — app cannot decide | Use visual/handheld/site consensus to decide |
| 🔴 UNSAFE | Speed limit exceeded, or 3+ pilot unsafe votes | Do not fly |
| Zone | Direction | Speed limit | Sector |
|---|---|---|---|
| R001 | W to N (270°–360°) | ≤ 30 kph | GREEN |
| R002 | SW turbulence (225°–270°) | ≤ 25 kph | YELLOW |
| R003 | N high sink (0°–45°) | ≤ 20 kph | YELLOW |
| R004 | Over the back (45°–225°) | ≤ 10 kph | YELLOW — backwind |
| Zone | Direction | Speed limit | Sector |
|---|---|---|---|
| R005 | SW to N (225°–45°) | ≤ 30 kph | GREEN |
| R006 | NE turbulence (45°–90°) | ≤ 15 kph | YELLOW |
| R007 | S turbulence (180°–225°) | ≤ 20 kph | YELLOW |
| R008 | Wind rotor (90°–180°) | ≤ 10 kph | YELLOW |
Zone limits are from the SAHPA risk assessment. Speed is 10-minute average (avgSpd). Direction is corrected before zone lookup.
The LHU sensor sits in a venturi at the launch. Speeds read higher than open-air because of the compression effect. Zone limits account for this.
| Zone | Direction | Speed limit (gust) | Sector |
|---|---|---|---|
| R009 | SSW to WSW (202°–248°) | ≤ 52 kph | GREEN — on condition |
| R010 | WSW to W — ridge rotor (248°–270°) | ≤ 46 kph | YELLOW |
| R011a | S to SSW (180°–202°) | ≤ 45 kph | YELLOW |
| R011 | W to S via North (270°–180°) | No fly | RED |
Glen Club measures the landing field. Direction matters as much as speed here — a north or east wind at the landing means pilots are flying into rotor or turbulence off the ridge.
| Zone | Direction | Speed limit (avg) | Sector |
|---|---|---|---|
| R012 | SSW to N (202°–360°) | ≤ 22 kph | GREEN |
| R013 | SE to SSW — rotor (135°–202°) | ≤ 22 kph | YELLOW |
| R014 | N to SE (0°–135°) | No fly | RED |
Raw compass readings are corrected before any zone or status logic runs. Current values (from config.json):
| Sensor | Offset applied | Effect |
|---|---|---|
| Back (signalhill) | −22° | Corrects for mast orientation |
| Front (lionsheadlower) | +2° | Minor launch alignment |
| Seapoint | 0° | No correction needed |
| LH Upper | 0° | Holfuy self-calibrated |
| Glen Club | 0° | GlenWind self-calibrated |
Corrections are defined in config.json and applied at fetch time. Cards always show the corrected direction. When a correction is updated, old database readings are not changed — the correction is applied fresh each time history is displayed.
All six sensors write into a single Supabase database. Every reading is stored as a permanent raw fact — direction, average speed, gust, lull, and temperature where available. Nothing is discarded.
| Capability | How it works |
|---|---|
| Full history playback | Scroll back through any sensor on any past day. The app replays the same zone and rule logic against the stored readings. |
| Cross-site comparison | Signal Hill and Lion's Head history on one timeline. See how Glen Club and Seapoint track each other during a building sea breeze. |
| Calibration without rewriting history | If a direction correction is updated, the database readings stay unchanged. The new correction is applied when you view history — so you can see what the old and new calibration would have shown for the same event. |
| Rule testing | A proposed new safety rule can be run against 90 days of stored readings before it is activated. See Section 8. |
The database retains 90 days of raw readings across all sensors. Hourly summaries for longer-term analysis are planned. Raw readings are written by Netlify server functions only — the browser never writes sensor data.
Some dangerous conditions at a launch or landing show up at a different sensor first. SigsSafe uses cross-sensor patterns to warn pilots before the problem reaches the critical point.
| Pattern | What it means | Early signal |
|---|---|---|
| Building westerly at Signal Hill | Seapoint often accelerates before the Back sensor crosses its limit. A Seapoint spike alarm is a 5–10 minute warning for Sigs conditions. | Seapoint ↑ trend |
| SW breakthrough at Signal Hill | When Glen Club starts reading strong SSW and Seapoint backs up, a SW surge at Signal Hill is likely within minutes. | Glen SSW + Seapoint rising |
| Wind shift at Glen Club landing | The landing field can flip from a clean SSW to a rotor-producing SE while the launch still reads fine. Glen Club is the only sensor that catches this directly. | Glen direction crossing 202° toward SE |
| Lion's Head Upper going off condition | When LHU direction shifts toward W (above 248°) the venturi amplifies the speed rapidly. R010 caution is an early indicator before R011 no-fly. | LHU direction 248°–270°, speed rising |
These patterns are currently used as manual awareness cues. Future versions will formalise these as named rules that fire automatic caution banners.
A safety rule is a simple if-then statement: “if Glen direction is between 135° and 202° AND Glen average speed exceeds 18 kph, show CAUTION at the landing.” Before a new rule is activated, it needs to be tested.
Because all sensor readings are stored raw in the database, a proposed rule can be replayed against real past data without touching the live app at all.
| Step | What happens |
|---|---|
| 1. Write the rule | Define the conditions — sensor, direction range, speed threshold, time window. |
| 2. Run it against history | The rule is applied to every stored reading from the past 90 days. It counts how many times it would have fired. |
| 3. Compare with pilot reports | Cross-check the rule trigger times against the pilot feedback log. Did the rule fire when pilots were actually reporting problems? Did it fire when conditions were fine? |
| 4. Adjust thresholds | If the rule fires too often on benign conditions, raise the threshold. If it misses real events, lower it. Rerun against history until it fits. |
| 5. Activate | Once the rule performs well against historical data, it is added to the live decision logic. |
Example: a proposed “Glen landing rotor caution” rule was tested against 60 days of Glen Club readings and matched 8 out of 9 pilot reports of difficult landings in that period, with 3 false positives on days pilots reported no issues. Threshold was raised by 2 kph and retested before activating.
A sensor is treated as stale (equivalent to offline for decision purposes) if its last reading is more than 3 minutes old. This threshold is the default and can be adjusted via stale_min in config.json.
| Condition | Effect |
|---|---|
| Last reading < 3 min ago | Sensor is “recent” — used normally in all rules |
| Last reading ≥ 3 min ago | Sensor is “stale” — treated as offline for status logic |
| No reading at all | Sensor is “offline” — same as stale |
Stale sensors are shown in the card header with a greyed clock icon. The decision tree falls through to the appropriate MANUAL or CAUTION rule (see Section 2).
Note: LH Upper updates every 2 minutes and Glen Club every 5 minutes by design — these are not stale. The stale threshold only triggers if a sensor stops reporting unexpectedly.
These warnings run independently of the overall status. The status banner shows current live conditions. The warning strip below shows active S and T warnings — the pilot sees FLYABLE + a warning rather than being blocked.
| Code | Meaning | Example |
|---|---|---|
| SR001·BACK 7m | Stabilising on R001, Back sensor, 7 min cooldown left | Speed exceeded R001 limit, now below — waiting out timer |
| SR001·BACK ⌛ | Timer done, awaiting next reading below limit | Timer expired between sensor polls |
| TR002·FRONT →28kph | Trend projects Front will exceed R002 (25 kph) next reading | 3 rising readings: 18→22→24 kph, projects 28 |
The 🔔 ALARM button controls audio alerts only — PC only at the moment; mobile alarm support coming soon. Both S and T alarms fire once per event. The pilot can silence audio without losing the visual warning.
Applies to R001, R002, R003 (Signal Hill) and R005 (Seapoint). Not applied to R004, R006, R007, R008. When any included zone's speed limit is exceeded, a cooling timer starts. Timer restarts on each new exceedance; worst-case peak excess determines wait time.
| Peak excess above zone limit | Minimum wait | Example |
|---|---|---|
| < 5 kph over limit | 5 minutes | R001 limit 30 → reads 32 kph (+2) |
| 5 – 9 kph over limit | 10 minutes | R001 limit 30 → reads 37 kph (+7) |
| ≥ 10 kph over limit | 30 minutes | R001 limit 30 → reads 42 kph (+12) |
32 kph in R001, drops to 25, stays there — clears after 5 min.
37 kph, drops to 20 — 10-min timer. Spikes to 44 before clearing — timer restarts, worst excess now +14, locked for 30 min.
Sensor stale while stabilising — counter pauses. Resumes when sensor comes back online; may already have expired.
Direction shifts R001 to R002 mid-timer — zone max drops from 30 to 25. Current speed re-checked against new limit; if exceeded, timer restarts.
If 3 consecutive readings on any sensor are strictly rising and the projected next reading would exceed the zone limit, a spike alarm fires before the limit is crossed.
| Reading | Back speed | Below R001 limit (30)? |
|---|---|---|
| t − 4 min | 22 kph | ✓ |
| t − 2 min | 26 kph | ✓ |
| t − 0 min | 29 kph | ✓ |
| t + 2 min (projected) | 32 kph | ✗ → ⚡ SPIKE ALARM |
Seapoint often leads Signal Hill by several minutes in a building westerly — a Seapoint spike alarm is an early warning for Sigs conditions. The same logic applies to Glen Club as an early warning for the Lion's Head landing.
A computed condition on the Sea sensor. When Sea direction is 270°–337° (WNW to NNW) and average speed exceeds 15 kph, there can be increased turbulence on landing. Shows as S-Promenade Wall in the banner. Always CAUTION · ALERT — never causes UNSAFE on its own.
Any pilot can tap REPORT UNSAFE to register a vote. Votes are stored in the database and visible to all pilots on site. When 3 or more net “unsafe” votes accumulate, the app overrides all sensor logic and forces 🔴 UNSAFE.
| Parameter | Value (config.json) |
|---|---|
| Votes required to call UNSAFE | 3 |
| Vote expiry window | 10 minutes |
| Storage | Database (server-side, shared across all users) |
This mechanism is for when pilots physically on site observe dangerous conditions that the sensors have not yet captured — rotor, unexpected turbulence, equipment failure. It is a collective safety tool, not a protest button.
Use responsibly: A false UNSAFE call affects every pilot checking the app. Only vote unsafe when you have direct, current evidence of dangerous conditions at the site.
Official risk assessment document (v1.7, February 2026):
SAHPA Risk Assessment — Lion's Head & Signal Hill v1.7 ↗
| TIME | BACK - Tower | FRONT - Launch | SEAPOINT | STATUS |
|---|
| TIME | GLEN CLUB (Glen Wind) | LH UPPER (Holfuy) | LH LOWER | STATUS |
|---|