EN ES

ALARMA 1000

· sip water · stay present ·
0 / 8
sips today
0
day streak
0
best day
0
lifetime
Goal: 21 days 0%
Press START. The alarm rings now and every hour, 8 times total. When it rings → drink water → tap "OK, I'VE HAD THE WATER".
Want a different sound, theme, or continuous mode? Everything's right below in ⚙ Advanced settings.
⚙ Advanced settings

Daily log · journal

Every day you use the app. Tap a cell for details.
📊 Advanced stats
0
tracked days
0
goal days
0%
completion
0
avg sips/day
0
best streak
0
current streak
Last 12 weeks
How many days the overall goal lasts, e.g. 21 for 3 weeks, 365 for a year.
First day of this goal (auto-set today if blank).
Optional. Pick a future date and the app sets the duration to match. Leave empty to use the default above.

Profiles

Save multiple settings configurations and switch between them — work, sleep, weekend, travel.
Quick-access link to switch profiles, near the title.

Schedule

Default 60 = every hour
Start at 9:12 with 30-min interval → alarms at 9:30, 10:00, 10:30, …
Also sets your daily sip goal (ignored in continuous mode)
Keep ringing at the interval all day, no limit. Sip forever.
The interval is the minimum time between sips, not a fixed wall-clock grid. If you ack at 13:03 with a 1-hour interval, the next alarm shifts to 14:03. Off = rigid clock grid (good for pomodoro, meditation bell, or any "ring at 9:00/10:00/11:00" use case).
Re-rings every N min until acknowledged
How long an unanswered alarm keeps ringing before pausing. Default 9, matching iOS.
Countdown timer after tapping "I'll prepare water now"
Show a "Ready?" step with a countdown you must start yourself.

Alert mode

Strobes black ↔ white. Visible through closed eyelids.
Device vibration on alarm. Android only. iOS Safari ignores the vibration API.
Audio alarm (off = silent)

Sound

Synthesized. No file needed.
Plays your custom file if uploaded, otherwise the built-in sound above.
No file
Max ~3 MB. The clip loops while the alarm rings, so 5–15 seconds is plenty. A whole song won't fit in browser storage.
Any HTTPS direct audio stream. Loops until you ack the alarm. Needs internet; won't work offline.
Example: https://ice1.somafm.com/secretagent-128-mp3 tap to use. SomaFM · Secret Agent.
Stations like the example are courtesy of SomaFM. Listener-supported, commercial-free. Support SomaFM →
Priority: Custom file → Stream URL → Built-in sound

Theme

🎨 Custom colors (HEX)
Pick HEX values to brand the app to your liking. Click "Apply custom" to make this the active theme.
🎨 Theme studio
Build, save, and share themes. Save current colors, rename / edit / duplicate / delete, export and import as JSON, or hand off to AI: copy a prompt, paste back the result.
No saved themes yet. Tweak the colors above and click "Save as named theme".

Language

Choose your preferred language. On alarm1000.com it defaults to English, on alarma1000.com to Spanish.
Import translation file
Paste or upload a JSON translation file (offline mode only).
Export translation pack
Essential = core UI only (buttons, labels, alerts, errors). Small enough to fit in one reply on any free AI, even logged-out Copilot. Full = everything, including long hints and the About section. For the full file you'll likely want a paid tier on whichever AI you use (ChatGPT, Claude, Copilot, Grok, Gemini). Free exceptions that handle it without login: claude.ai and chatgpt.com. Logged-out Copilot will cut off mid-file. That's the AI, not the app.
Add a new language with AI
💡 Want a language that isn't included? Three steps:
  1. Click Export above and open the downloaded .json file in any text editor (Notepad, TextEdit). Copy everything inside.
  2. Copy the prompt below, replace LANGUAGE_YOU_WANT with your language (e.g. Deutsch, Français, 日本語), and paste the JSON contents where it says JSON_FILE_CONTENTS_HERE. Send the whole thing to any AI (ChatGPT, Claude, Copilot, Gemini).
  3. Save the AI's reply as a .json file and click Import above.
📝 Example (for German): Before (what you copied): Translate the string values in this JSON to LANGUAGE_YOU_WANT
JSON: JSON_FILE_CONTENTS_HERE
After (what you paste into the AI): Translate the string values in this JSON to German
JSON: {"_lang":"xx","_name":"Your language name","title":"ALARM 1000", ... }
Power user
🔧 Power user? Two extras: (1) To make a specific language the default for your copy, open index.html in a text editor, find the line "return 'en';" inside function detectLang(), and change it to e.g. "return 'de';". That becomes the fallback when no domain/browser match is found. (2) A Python helper (chunk_translation.py, bundled with the app source) splits the Full export into N pieces that fit any free AI (even logged-out Copilot). Run it with --help to see usage. (Tip: to bake a translation into a shareable HTML file, use "💾 Save settings as new HTML file" in My Settings · Tweaks instead of hand-editing.)

Customize text · import / export

Edit any button label or modal text. Leave blank to use the default.
Your company logo or profile picture, shown at the top.
Pre-filled text when users share (Twitter, WhatsApp, etc.)
If blank, the current page URL is used (e.g. your website).

Your data · self-hosting

Everything the app remembers (sips, streak, goal, schedule, theme, language, any custom text) lives in your browser's localStorage. Nothing is sent anywhere.

What keeps your data

  • Closing the tab or the whole browser
  • Restarting the computer or phone
  • Days, weeks, or months between visits
  • Hard refresh (Ctrl+Shift+R)

What wipes it

  • Clearing browser data: instant wipe.
  • Private / incognito mode: data disappears when you close the window.
  • Different browser: Chrome and Firefox don't share storage.
  • Different device: there's no cloud sync.
  • Safari's 7-day rule. Safari on iOS and macOS wipes localStorage for sites you haven't opened in 7 days. For a reminder app, this is the big one. Open the app at least once a week on Safari, or use a different browser there.
  • Low disk space on phones: rare, but browsers can evict storage under pressure.

Customizing your own copy

If you plan to change a lot (custom labels, sounds, schedule) and want those changes to stick: host the HTML on your own machine. Opening the downloaded file directly (double-click → file://) works, but localStorage tied to file:// is fragile: renaming or moving the file can lose your data.
The simplest durable setup: put the HTML in a folder and run any tiny static server. From that folder: python3 -m http.server 8000 then open http://localhost:8000. Your data is now tied to localhost and stays stable as long as you keep using that same port.

About & privacy

Alarm 1000 (alarma1000.com in Spanish) is a single-file open-source water reminder. No account, no server, no backend. Double-click the HTML and it runs.
Alarm 1000 is an open-source hydration reminder. No account, no server, no backend. Alarms are scheduled with your phone's OS so they fire on time even when the app is closed and the screen is locked.

Contact

For bug reports: bugs@alarm1000.com

Reliability · when it works best

This is a browser app, not a native alarm. It works best while your phone is unlocked or the app is open. When the phone is locked, browsers (especially iOS Safari) throttle background timers hard, so some alarms may fire late or not at all. For medication or wake-up alarms, use your phone's built-in alarm app. For hydration, opening the app now and then, or keeping it in a visible tab, is usually enough.
Alarms are scheduled directly with your phone's OS, so they fire on time even when the app is closed and the device is locked. On Android, intervals shorter than 9 minutes may be batched while the screen is off (a Doze-mode constraint that affects every app on the platform); intervals of 9 minutes or longer fire exactly when scheduled. After a reboot, the alarms restore themselves.

Privacy

In plain English: we're not spying on you. Your sips, streaks, and settings stay on your own phone or computer. We don't have a login, a database, or any way to know who you are. You could turn off the internet right now and the app would keep working.
Everything this app stores lives on your device, in your browser's localStorage: your sip counts, goal, schedule, theme, language preference. Nothing is sent to any server we control.
Everything this app stores lives on your phone, in the app's private storage: your sip counts, goal, schedule, theme, language preference. Nothing is sent to any server we control. Uninstalling the app deletes all of it.
The only outbound network activity is a background fetch to public IPFS gateways (dweb.link, ipfs.io, 4everland.io, w3s.link) for the donation-address + news chip config. Those gateway operators can see your IP and which CID you requested. That's inherent to any HTTPS fetch. We don't log anything ourselves.
No analytics. No cookies. No fingerprinting. No ads. No third-party scripts executed. No email address required. No account.
Hosted in Iceland. Site operator is bound by Icelandic Act No. 90/2018 and (for EEA visitors) the GDPR. You have the right to request information about, correction of, or deletion of any data we hold about you. Since we hold none, these requests are trivially satisfied.
No backend, no operator-held data. The web version is hosted in Iceland but this native app talks to no servers we control — only optional public IPFS gateways for the donation-address config. You have the right to request information about, correction of, or deletion of any data we hold about you. We hold none.
This privacy posture may change if the app grows (e.g. if we ever add optional cloud sync, analytics, or a backend). Any change will be announced in the app itself via the update banner, and described here. Zero ongoing maintenance is the goal, but not the guarantee.

License & source

The HTML file you're looking at is the entire source. Right-click → View Source. You're free to inspect it, fork it, self-host it. Keep donation addresses yours if you do.
Released under the MIT License. The whole UI is one HTML file (grab it from alarm1000.com to inspect, fork, or self-host). The native shell wraps it in Tauri so alarms can be scheduled at the OS level. Keep donation addresses yours if you fork.

My settings · tweaks

Everything you've changed from the defaults. Hit the button below to save a new HTML file with these as its built-in defaults.

Reset

Each option is independent. Confirmation required for both.
Clear daily log & streak
Wipes your heatmap history, current streak, best day, and lifetime sip count. Settings, custom labels, logo, and sounds all stay. Can't be undone.
⚠ Factory reset: clear everything
Nukes every trace: settings, daily log, streak, custom labels, logo, sounds, imported languages, cached config, UI preferences. Starts fresh like a new install. Type RESET to confirm. Can't be undone.
Single HTML file. Double-click to open in any browser. No install, no server, fully offline.
Official source:
Backup (IPFS):
Both are baked in. If a snapshot (e.g. web.archive.org) of this page shows a different IPNS, the copy you're looking at has been tampered with.
💧 SIP