Local web app version of Anchor Force.xlsx.
It calculates anchor wind load, tidal-stream load, HW-set minimum and optimal rode lengths, per-tide-state scope, estimated combined chain/rope catenary, seabed rode, rope-on-seabed risk, weight to lift, tide-derived or echo-sounder depth, and keel clearance. Boat-specific constants live on the Settings tab. The Planner shows a single ordered tide timeline around now, for example Previous LW/HW, Now, Next LW/HW, and Subsequent LW/HW, so you can check the following low-water grounding risk without a separate diagram mode. The Tide tab accepts Oban HW/LW times and heights, can apply user-entered secondary-port corrections, and estimates tide rise now with the rule of twelfths. The Tide Data tab can fetch seven-day Oban tide events from the ADMIRALTY UK Tidal API; when fetched events are available, the app automatically uses the bracketing previous and following tide events for the present time.
Use Save settings to make the current planner, tide, and boat settings the defaults for this browser.
Settings includes boat constants, editable chain/rope reference values, whether the echo sounder reports depth beneath the keel or actual water depth from the surface, and system settings such as the UKHO API key and UT/local display mode. New installs default to local time display and 1.2 m draft.
The anchor drag check uses the entered anchor UHC as ideal near-horizontal holding, then reduces it for the estimated high-water pull angle before comparing it with wind plus tidal-stream load.
Rope defaults use 14 mm LIROS Anchorplait nylon: 0.16 kg/m, from the midpoint of 150-175 g/m, and 3,700 kgf breaking strain as the conservative lower end of the 3,700-4,400 kg range.
The About tab shows the web and server version numbers so you can check whether a Lubuntu machine has the latest pull.
Tide source, Oban tide entries, selected secondary port, secondary-port correction table, deleted built-in port ids, Tide Data settings, and fetched tide rows are stored on the server in data/anchor-force-state.json. Provider cache files live under data/cache/.
The planner and server run locally. Once tide data has been fetched at least once, ordinary use does not require internet.
- Starting the app, changing settings, editing manual tide values, switching tide views, and recalculating anchor loads use local files/browser state only.
- Fetched UKHO tide events are stored in
data/anchor-force-state.jsonand cached underdata/cache/. - If today's tide cache is not available, the server can use the latest stored tide cache for the configured station and marks it as stored offline/stale data.
- Refresh tides requires internet to obtain new UKHO data. If the provider is unreachable but stored data exists, the app keeps using the stored data.
Before going offline, open the app while connected and run Refresh tides for the station you plan to use.
These calculations are planning estimates, not certified engineering or a substitute for local judgement.
- Wind load uses a drag equation estimate:
0.0165 * projectedWindageArea * windSpeed^2, where projected windage area is estimated asLOA^2 * windageFactor. The default windage factor of0.34is retained for a 10.1 m bermudan sloop; it gives about 515 kgf at 30 kn, close to conservative published examples for 33-35 ft yachts. - Tidal-stream load uses the same drag-equation approach in water:
13.2 * LOA * draft * underwaterDragFactor * tidalStream^2. The default underwater drag factor is0.40, a conservative simplification for a Westerly Storm Cruiser with twin keels and rudder exposed to tidal stream. - Tide rise uses the rule of twelfths between the previous and following downloaded tide events where available, falling back to the entered LW and HW. It is a quick interpolation only; tide curves, barometric pressure, surge, river flow, and local effects can make real water levels differ.
- Tide Data uses Oban UKHO station
0372by default. The ADMIRALTY API key is stored only on the local server or read fromUKHO_API_KEY; it is not returned to the browser. UKHO tide events are cached once per day. Downloaded event times are treated and stored as UT. The system display setting can show those times, Tide tab HW/LW inputs, and the tide graph in either UT or this browser's local time without changing the stored UT values. - Secondary-port time differences use the almanac-style 0000/0600/1200/1800 columns and interpolate by the standard-port event time. Secondary-port height differences use the MHWS/MHWN/MLWN/MLWS columns and interpolate by the entered Oban reference levels.
% Springis calculated from the tide range between neighbouring HW/LW events where possible, and can be below 0% or above 100%. - Built-in editable secondary ports currently include Tobermory, Cuan Sound, Sound of Mull (Craignure), Port Ellen, and Loch Melfort from user-entered almanac-style data. Where LW time corrections were not supplied, the app uses the same fixed offset as HW or 0 minutes and records that caveat in the port note. The app does not bundle UKHO/Reeds correction tables; enter only data you are licensed to use.
- Catenary is estimated separately for lifted chain and lifted rope. Surplus rode can lie on the seabed, and the diagram caps deployed rode at chain plus rope carried.
- Minimum rode is the selected-high-water scope recommendation from the load table. Optimal rode is the shortest deployed length that keeps at least 1 m of chain on the seabed at selected high water, capped by carried chain plus rope.
- Anchor holding is highly seabed- and set-dependent. The UHC input should be treated as an ideal near-horizontal holding value. The app applies a simple pull-angle reduction, but it cannot model seabed type, veering, snatch loads, yawing, fouling, weed, or shock loading.
- NASA Glenn Research Center, The Drag Equation: basis for the wind and tidal-stream drag models.
- NOAA National Ocean Service, Tides and Currents: tide height and tidal current are related but distinct navigation data.
- NOAA Tides & Currents, FAQ: do not assume slack water or peak tidal current occurs exactly at HW/LW.
- BoatUS Foundation, Docking study guide: standard anchoring scope guidance and bow-to-bottom scope definition.
- boats.com, Anchoring Essentials: wind load rises with wind speed squared and can become large quickly on cruising boats.
npm startThen open:
http://127.0.0.1:4184
From the project directory:
chmod +x scripts/start-macos.sh scripts/install-macos.sh
./scripts/install-macos.shThen double-click Anchor Force Planner.app on the Desktop. It starts the local server in the background and opens the app in the default browser.
To run from Terminal instead:
./scripts/start-macos.shInstall dependencies:
sudo apt update
sudo apt install -y git nodejs npmClone and install the user service and desktop launchers:
git clone https://github.com/mcdonaldajr/anchor-force-planner.git
cd anchor-force-planner
chmod +x scripts/install-lubuntu.sh
./scripts/install-lubuntu.shStart the server from the desktop icon, or run:
systemctl --user start anchor-force-plannerStop the server with:
systemctl --user stop anchor-force-plannerCheck status and logs with:
systemctl --user status anchor-force-planner
journalctl --user -u anchor-force-planner -fThe Lubuntu service binds to 0.0.0.0, so other devices on the same Wi-Fi can access it. The desktop icons only start and stop the server; they do not launch Firefox. Use a browser bookmark for http://127.0.0.1:4184.
- Start the server on Lubuntu with the desktop icon or
systemctl --user start anchor-force-planner. - Keep the iPad and Lubuntu machine on the same Wi-Fi network.
- Open the Lubuntu machine's LAN URL in Safari, for example:
http://192.168.1.42:4184
- Open that URL in Safari on the iPad.
If the iPad cannot connect, check the Lubuntu firewall:
sudo ufw allow 4184/tcpFrom the app folder:
git stash push -m "local changes before update"
git pull
chmod +x scripts/start-lubuntu.sh scripts/launch-desktop-lubuntu.sh scripts/install-lubuntu.sh
./scripts/install-lubuntu.sh
systemctl --user restart anchor-force-plannerThen open your browser bookmark again and check About. The web and server versions should match.
Install these first:
- Node.js LTS
- Git for Windows, unless you download the repository as a ZIP file
Open PowerShell, then run:
git clone https://github.com/mcdonaldajr/anchor-force-planner.git
cd anchor-force-planner
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\install-windows.ps1Start the server:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\start-windows.ps1Then open:
http://127.0.0.1:4184
To start the server and open the browser in one step, add -OpenBrowser.
Stop the server:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\stop-windows.ps1Check whether it is running:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\status-windows.ps1To create desktop shortcuts for starting and stopping the server:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\install-windows.ps1 -CreateDesktopShortcutsTo create shortcuts that start the server in LAN mode, add -LanShortcuts.
For LAN access from another device on Windows, start in LAN mode:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\start-windows.ps1 -LanThen open the Windows machine's LAN address from the iPad, for example:
http://192.168.1.23:4184
Windows Firewall may ask whether to allow Node.js on private networks. Allow it only on trusted private networks.
cd anchor-force-planner
git pull
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\install-windows.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\stop-windows.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\start-windows.ps1