Legal
This document explains exactly what data Undistracted Me collects, how it is used, and the terms under which you may use the extension and website. We have written it to be human-readable, not lawyer-readable.
Undistracted Me is designed to keep your data on your device.
The short version
We do not operate a user database. We do not collect your name, email, or any personally identifiable information on our own servers. We do not track your browsing history. All widget configuration stays in your browser's local storage.
Some API calls are routed through our backend at
undistractedme.sarojbelbase.com.np
so that secret API keys are never embedded in the extension bundle. These calls are:
client_secret never leaves our server. The token is returned to your browser immediately and not stored by us.Our proxy does not log user-identifiable information. Standard web-server access logs (IP address, timestamp, HTTP method) may be retained for up to 30 days by our hosting provider (Vercel) for security and abuse-prevention purposes.
The Weather widget can optionally use your location to show local weather. The browser prompts you for permission before any coordinates are read. Coordinates are sent directly to Open-Meteo (a privacy-respecting, open-source weather service) and are never stored or sent to us. If you decline, you can enter a city name manually.
As a last resort when neither browser geolocation nor a manual city is available,
the extension may call a public IP-based geolocation service (freeipapi.com for extension origins;
ipapi.co additionally in website mode). Only your IP address is sent; no personal identifier is stored.
Both domains are declared in the extension’s host_permissions and are only contacted for this fallback purpose.
The following external services are contacted when you use specific features. No service is contacted until you enable or use the corresponding feature.
| Service | Purpose | PII sent? |
|---|---|---|
| api.open-meteo.com | Weather data — no API key, open source | None |
| geocoding-api.open-meteo.com | City name → coordinates lookup | None |
| nominatim.openstreetmap.org | Reverse geocoding (coordinates → city name) | IP only |
| freeipapi.com | IP-based location fallback | IP only |
| ipapi.co | IP-based location (website mode only) | IP only |
| nepalipaisa.com | Nepali stock company list | None |
| www.merolagani.com | Nepali stock chart data | None |
| api.spotify.com | Spotify playback control & now-playing | OAuth token |
| accounts.spotify.com | Spotify OAuth authentication | Credentials |
| www.googleapis.com | Google Calendar events (read-only) | OAuth token |
| tasks.googleapis.com | Google Tasks — read, create, update, delete | OAuth token |
| people.googleapis.com | Google Contacts search (read-only) | OAuth token |
| oauth2.googleapis.com | Google token endpoint (Firefox — via our server) | Via server |
| undistractedme.sarojbelbase.com.np | Our Vercel proxy (photos, favicon, FF token exchange) | API key |
Note on OAuth tokens
When you connect Google or Spotify, an OAuth access token is issued by the respective service and stored in your browser's local storage (or session storage in website mode). This token is sent with each API call to authenticate you — it is never sent to our servers except during the Firefox Google token exchange, where it is forwarded immediately to your browser without being persisted.
Undistracted Me can optionally connect to your Google account. No Google feature is active until you explicitly sign in.
| Scope | Used by | Access level |
|---|---|---|
| userinfo.profile | Display your name and avatar | Read only |
| userinfo.email | Identify which account is connected | Read only |
| calendar.readonly | Google Calendar widget — upcoming events | Read only |
| contacts.readonly | Contact search in the events panel | Read only |
| tasks | Tasks panel — view, create, complete, delete tasks | Read & Write |
What we do NOT do
We protect your sensitive Google user data (Calendar events, Contacts, and Tasks) by ensuring it never leaves your device. We do not operate any database or remote storage servers. Your data is securely stored purely locally on your device within your browser's sandboxed chrome.storage.local or localStorage environment, which is accessible only by the extension itself. We employ encryption in transit (HTTPS) for all direct API calls between your browser and Google's servers.
We retain your Google user data locally only for as long as your account remains connected to the extension. We provide an explicit "Disconnect" mechanism in the extension's Account Settings panel. The moment you click Disconnect, all cached Google user data, profile information, and authentication tokens are immediately and permanently deleted from your local storage. Furthermore, uninstalling the extension prompts the browser to automatically delete all associated local storage data.
In addition to disconnecting within the extension, you can revoke the extension's permissions entirely at any time from myaccount.google.com/permissions. Revoking access does not delete any data from Google's servers — it only removes our application's ability to read or interact with your Google data.
On Chrome, authentication uses
chrome.identity.getAuthToken()
— token management is handled entirely by the browser. No client secret is needed.
On Firefox, a PKCE OAuth flow is used.
The authorisation code is exchanged for tokens via our Vercel endpoint, which injects
the client_secret
server-side. The secret is never present in the extension bundle.
The Spotify widget is entirely opt-in and requires explicit sign-in.
Spotify authentication uses the standard PKCE flow. Only the
client_id
and a locally-generated code_verifier
are sent — no client secret is involved. Token exchange goes directly to
accounts.spotify.com/api/token
and never through our servers.
chrome.storage.local (extension) or sessionStorage (website mode — cleared when the tab is closed).localStorage so they display on return visits. Your avatar URL is not persisted — it is held in memory for the current session only and re-fetched on reconnect.
A content script is injected into SoundCloud pages
(*://*.soundcloud.com/*) only.
It polls navigator.mediaSession
for track metadata and sends it to the background service worker so it can be displayed
in the Focus Mode media panel. No data is sent to any external server. The content
script does not modify the SoundCloud page.
All user data is stored locally in your browser.
| Storage type | What is stored | When cleared |
|---|---|---|
| chrome.storage.local | Widget settings, Spotify tokens, Google Calendar cache, OAuth connected flags | Extension uninstall |
| localStorage | UI preferences, theme, widget layout, search history, Zustand state | Manual clear / uninstall |
| sessionStorage (website only) | Google and Spotify OAuth tokens — scoped to tab session | Tab close |
chrome.storage.local, which cannot be accessed by other websites. Less sensitive UI preferences use standard localStorage.sessionStorage, guaranteeing they are permanently wiped from your browser the moment you close the tab.localStorage. User-identifying artefacts such as avatar URLs are held in memory only and never written to persistent storage.redirect_uri against a server-side allowlist, preventing stolen authorisation codes from being exchanged via a forged redirect.
No data is synced to the cloud via chrome.storage.sync.
Data does not leave your device except for the API calls described in Section 2.
Undistracted Me declares only the permissions necessary for its features.
| Permission | Why it is needed |
|---|---|
| identity | Google OAuth (getAuthToken) and Spotify PKCE (launchWebAuthFlow) |
| storage | Widget configuration, Spotify tokens, Google Calendar event cache |
| geolocation | Weather widget auto-location — browser prompts user before coordinates are read |
| topSites | Quick Access widget shows the user's most-visited sites — data is displayed inline only |
| tabs | (a) Check if a new-tab page is active before showing a look-away notification; (b) route media playback commands to the SoundCloud content script |
| notifications | Google Calendar event reminders, Pomodoro timer completion, look-away break alerts |
| alarms | Minute-level periodic alarm for event reminders and look-away timer — required because MV3 service workers do not persist |
| scripting | Re-injects the SoundCloud media content script into already-open tabs when the extension is installed, updated, or Chrome restarts — ensures media controls work without a page reload |
Undistracted Me is not directed at children under the age of 13. We do not knowingly collect personal information from children. If you believe a child has provided personal information, please contact us and we will remove it.
We may update this policy when we add new features that affect data handling. The "Last updated" date at the top will change. Significant changes will be noted in the extension's changelog.
Questions, concerns, or data requests: hey@sarojbelbase.com.np
Website: https://undistractedme.sarojbelbase.com.np
By installing or using Undistracted Me, you agree to these terms.
Undistracted Me is provided free of charge for personal, non-commercial use. You may not reverse-engineer, redistribute, or create derivative works that misrepresent their origin as official Undistracted Me releases.
Features that connect to Google or Spotify are governed by those services' own terms:
You are responsible for complying with the terms of any third-party service you connect to through the extension.
Undistracted Me is provided "as is" without warranty of any kind. We do not guarantee uninterrupted availability, accuracy of third-party data (weather, stock prices, etc.), or compatibility with future browser versions.
To the maximum extent permitted by law, we shall not be liable for any indirect, incidental, special, or consequential damages arising from your use of the extension, including but not limited to data loss, service interruptions, or reliance on displayed information.
You agree not to:
The source code is publicly available. Community contributions are welcome under the terms of the project's licence. Using the source code in your own project must comply with that licence.
We may revise these terms at any time. Continued use of the extension after changes are posted constitutes acceptance of the updated terms.
These terms are governed by the laws of Nepal. Disputes shall be resolved in the courts of Kathmandu, Nepal.
Questions?
If you have questions about these terms or the privacy policy, reach out at hey@sarojbelbase.com.np. We aim to respond within 3 business days.