Lightshadow Español

Lightshadow — Privacy Policy

Last updated: 2026-10-09

This policy describes the Lightshadow mobile application, the Lightshadow web client that runs in a browser, and the Lightshadow server (the "API") that answers them both, and also the contact form on the lightshadow.app site (§4, §5.6). It is written to be checkable: every statement below describes what the software actually does, not what a privacy policy usually says. Where the app and the web client behave differently, it says which one it is describing. The older frozen demonstration page, published separately, is different software with a different data flow and is not covered by this policy.

One thing has to be said before the rest, because most of what follows depends on it: there are two configurations of this service, and the server picks which one you get. In the Google stack, the map and the address search come from Google, so your browser or your phone talks to Google directly and Google receives your IP address, the part of the map you are looking at, and the text you type into the search box — under Google's privacy policy, not this one. In the fallback stack, the map and the search are ours and OpenStreetMap's, and your search text does reach our server and is stored there. Neither you nor the app chooses between them. The server selects one for everybody, from how much of Google's free monthly allowance is left, and the answer can differ from one visit to the next. §8 describes both in full.


1. Who is responsible for your data

Lightshadow is made and operated by Nikita Khromushkin, an individual developer resident in Spain. There is no company behind Lightshadow and no corporate entity of any kind.

For anything in this policy, write to info@lightshadow.es.

He is also the controller of the messages you send us through the site's contact form.

No data protection officer has been appointed.


2. The short version

Sections 4 to 7 say exactly what this means, and §8 says who else is in the path.


3. What Lightshadow stores on your phone

All of it is ordinary app storage, readable only by Lightshadow, and removed when you uninstall the app.

WhatDetail
Saved routesUp to 100 entries. Each holds the start and finish labels, their coordinates, the departure time you asked for, your shade-preference setting, the distance and the shade percentage that were computed, and when it was saved.
SettingsYour chosen language, your chosen appearance (light/dark/system), and whether you have seen the first-run screen.
Recent searches (Android, from 0.2.4)The last 10 places you picked from a search — the name the app gave the point and its coordinate, on the phone only, offered back while the search box is empty. Never the text you typed and nothing of Google's (no place name from Google, no place ID). Cleared from Settings → Clear search history.
Cities you have asked forThe names of municipalities you have already requested, kept so the app does not let one phone send the same request twice.

None of this is sent anywhere. Android cloud backup is switched off for Lightshadow, and so is device-to-device transfer, so your saved routes do not travel to another phone or to a Google account.

You can erase the saved routes at any time from Settings → Delete saved routes, and the recent searches from Settings → Clear search history. Uninstalling the app removes everything in this table.

In the browser, the web client keeps the equivalent of that table in your browser's local storage, and nothing else: the saved routes (the same 100-entry limit), the language you chose, whether you have seen the first-run screen, the municipalities you have already asked for, and one true/false record that you have been shown the location prompt once, so that you are not asked again on every visit. No coordinate, no accuracy figure and no time of any position fix is ever written there. There is no cookie and no service worker. Clearing this site's data in your browser removes all of it.

Saved routes are a record of estimates you asked for, not of walks you took. Lightshadow records no track of where you went — not on the phone and not on our server — has no background location permission, and does nothing while it is closed.


4. What is sent to the Lightshadow server

This section is about our server only. In the Google stack your search does not come here at all — it goes from your device to Google, and §8 is the section that describes that. Everything below is what reaches us.

Lightshadow is a thin client: the sun and shade computation happens on the server, so the app has to send what you asked about. Every request carries:

The connection is HTTPS. The app refuses to send anything over plain HTTP. It stores no cookies and keeps no HTTP disk cache.

Per feature:

When you…What is sentWhat the server keeps
Open the appA request for the app's settings — which area is prepared, which credits to show, and which search service is in use. It carries no coordinate of any kind, not yours and not anyone'sNothing is stored beyond the operational line of §5.1: method, path, status and how long it took
Set a start or finish point (by tapping the map, by searching, or by "My location")That coordinateThe coordinate is stored in the analytics store described in §5 — with the hour, and nothing that identifies you
Type in the search box — fallback stackThe text you typed and one ranking coordinate, so results near it rank first. In the browser that is your start point, only if you had already set one. In the Android app from version 0.2.1 (2026-09-15) it is the other point of the walk if you had set one, otherwise the centre of the map on your screen, otherwise the centre of the prepared city — until 0.2.1 the app, like the browser, sent the start point or nothing. Never your device position unless you had chosen it as your start pointThe text and that coordinate are stored in the analytics store, with the hour, and nothing that identifies you
Type in the search box — Google stackThe text never reaches us. It goes from your device to Google (§8). What our server may receive is a note that a search happened, so that the free allowance can be counted: no text, no coordinate, nothing that identifies you. From Android 0.2.4 (2026-09-16), one thing does reach us: the coordinate of the place you picked from the list, sent so the point can be named after our own street nearest to it (the name Google gave the place is never shown on the map, so the app needs a name of ours)The text is not stored, because we never have it. The coordinate sent for the street name is not stored by that call — no row is written for it. The same coordinate is stored, coarsely, the moment the point is set: the row above
Plan a routeStart and finish coordinates, the departure time, your shade preferenceNothing is stored. They are used to compute the answer and are not written to any file
Look at the shade layer on the mapThe map rectangle you are looking at and the timeNothing is stored
Write to us through the site's contact formYour name, your e-mail address, the topic and the message you write, plus a hidden field that a person neither sees nor fills in — it only serves to recognise automated submissionsNothing is stored on the server. The message is forwarded at once by e-mail to info@lightshadow.es and is not written to any file, database or log; all that remains of the submission is the request's line in the operational log of §5.1 and one more line with the outcome (sent, dropped or failed), with nothing you wrote in either. To limit how many messages arrive from one address, your IP address is counted in memory only, for at most an hour, like the other counters in §9. What happens to the e-mail afterwards: §5.6
Ask for a city Lightshadow does not coverThe municipality name and the country codeA counter for that municipality is incremented. No coordinate is stored — the server rejects a request that tries to send one
The app crashes (every build released after 0.2.1, from 2026-09-16)The stack trace (the list of program locations the fault passed through — code, not your data), the app version and build number, the Android version, the phone model, the name of the thread that failed, and the time by your phone's clock. Nothing that identifies you or your phone: no install ID, no advertising ID, no coordinate, no search text, no logcatThe same fields are stored, in a crash store described in §5.5, with the hour they arrived — never the minute. 90 days. The server rejects a report that tries to send any other field

There is nothing else. The app makes no other network calls to us.

The web client does the same things through the same endpoints — one launch call that carries no coordinate at all, then coverage, route, shade, search and city requests, exactly as the table describes them. What differs in the browser is who draws the map, and in the Google stack who answers the search: §8.


5. What the server keeps, exactly

The server keeps three kinds of record about a request, and only three.

Corrected 14 September 2026: this line read "The server writes to three places, and only three". Read literally — as a count of files — it had stopped being true: there is a fourth file on the server, described in §5.4, and the service also reads two build keys from disk at start-up. Neither holds anything about you. The sentence now promises what it was always meant to promise. §17.

5.1 The operational log. One line per request, containing the HTTP method, the path, the status code and how many milliseconds it took. It contains no query string, no request body, no coordinate, no search text, no IP address, no User-Agent and no request identifier. The web server's own access log, which would otherwise print the full request line including coordinates and search text, is switched off.

5.2 The analytics store. This holds the things §4 says are kept:

Every coordinate in this store is rounded to three decimal places — about 100 m — before it is written. The exact value is used to answer your request and is not kept; what is stored places a point on a block, not at a doorway.

Every row carries only the hour it happened in, never a clock time. No row contains an IP address, a device identifier, a session key, the app's build key, the User-Agent, a request identifier or a sequence number. Rows are deliberately shuffled within each hour so that their order cannot be matched against the order of the operational log.

5.3 The city-request counters. How many times each municipality has been asked for, and in which hour. No coordinates, no identifiers, no one row per request.

5.4 The Google spend counter — a fourth file, which contains nothing about you. Since 14 September 2026 the server keeps a count of how many times each Google product we pay for has been used, per calendar month: a product identifier and a number. It exists so that Lightshadow can stop using Google before the bill does. It holds no request, no coordinate, no search text, no time finer than the month, no IP address and no identifier, and nothing in it can be traced back to a person or a request. It is named here because §5 promises a complete account of what the server writes, and a complete account has to list a file even when there is nothing of yours in it. It has no row in §9 and none in §10 for the same reason: there is no personal data in it to have a lawful basis or a retention period for.

5.5 The crash store — a third kind of record, since 16 September 2026. When the app crashes it sends one report to our server (§4, last row), and the server keeps it: the stack trace, the app version and build number, the build channel (sideload, Play or debug), the Android version, the phone model, the failing thread's name, the time by the phone's clock, and the hour the report arrived. Nothing else is written: not your IP address, which the server sees only to count requests and never writes down; not the User-Agent line; not a request identifier; not a sequence number. A crash report contains no identifier of you or your phone — the app's crash reporter is configured to collect none, and the server refuses a report carrying any field outside that list. The phone model is the one field with any fingerprinting value, and it is kept because a fault that only happens on one model is the commonest kind of Android fault; it is a model name shared by millions of devices, not a serial number. Crash reports go to us and to nobody else — not to Google, not to Firebase, not to any crash-reporting service. Under Google Play's data-safety vocabulary this is "crash logs: collected, not shared". They are deleted after 90 days (§10).

5.6 The contact form — no record on the server. A message sent from the site's form (§4) is not kept on the server: the server forwards it at once by e-mail to info@lightshadow.es and writes neither the message, nor your name, nor your address to any file, database or log. What remains is in the mailbox, hosted by Google Workspace as our processor (§8), where the message is deleted after 90 days (§10). We read messages to answer them and for nothing else: we add them to no list, send you no marketing, and match them against nothing else in this policy. Nor could we, because nothing the server keeps carries your name or your address.

A limit we will not hide. Storing search text and coordinates apart from anything identifying is the whole protection here, and it is not perfect. In an hour with very few requests, comparing how many lines the operational log has with how many rows the analytics store has can narrow down which request produced which row — and if there was exactly one of each, it identifies it. There is no fix for that at low traffic. It stops mattering as traffic grows, and we would rather say so than claim a separation that is stronger than it is.


6. What the server does not keep

Every line above is a statement about our server. None of them is a statement about Google or about the tile servers, which receive your IP address directly from your device and keep whatever their own policies say they keep. §8.


7. Location

Lightshadow collects precise location. Google Play defines "collect" as transmitting data off the device, and coordinates good to a few metres do go to our server. We declare it in the Play Data safety form as collected, required for app functionality, encrypted in transit, and not sold or shared for advertising.

How it works in practice:


8. Who else is involved

Who is in the path depends on the stack, and the server chooses the stack — not you, and not the app. Each recipient below says in which state it receives anything.

Google is involved in four ways now, and they are not all switched on at once.

Your device position — active in both stacks. When you use "My location" in the Android app, the fix comes from Google Play services' location provider. Google receives data as part of producing it, as its own controller and under its own terms, not under this policy. In the browser the position comes from the browser's own geolocation, which on an Android phone is usually the same Google service underneath.

Address search — active in the Google stack only, and this is the change that matters most. In the Google stack, what you type in the search box goes from your browser or your phone straight to Google, through Google's Places service. Google therefore receives the text you type and the IP address you type it from, as its own controller, under the Google Privacy Policy and not under this one. It does not pass through us on the way and it is not copied to us afterwards: we are not in that path, we cannot read it, and there is nothing about it for us to store, to show you or to delete. And the ranking coordinate goes with it. The client sends one coordinate to Google alongside the text, so that results near it come first, and Google receives it too. In the browser it is your start point, only if you had already set one. In the Android app from version 0.2.1 (2026-09-15) it is the other point of the walk if you had set one, otherwise the centre of the map on your screen, otherwise the centre of the prepared city; until 0.2.1 the app sent the start point or nothing. The centre of the map is an area Google already receives with every tile it draws (above); it is not a new fact about you, but it is now sent with the text, and this paragraph says so.

In the fallback stack none of that happens. There is no Google search call at all: your text is answered by Lightshadow's own Valencia street index on our own server, and it is kept there exactly as §4 and §5.2 describe.

The base map — in the app. Lightshadow draws on a Google Maps base map, and the Google Maps SDK is bundled in the Android app. The Android build distributed from lightshadow.app — version 0.2.0, published 2026-09-15, and every later one — carries a Google Maps key and shows the Google base map, in both stacks. So, in the app, Google receives your IP address and the map area you look at, on every pan and every zoom, as its own controller and under the Google Privacy Policy (https://policies.google.com/privacy), not under this one. Nothing you typed goes with a map request, and no account of yours is in it. One identifier is, and it is Google's, not ours: by Google's own disclosure for the Maps SDK and the Places SDK (https://developers.google.com/maps/documentation/android-sdk/play-data-disclosure, https://developers.google.com/maps/documentation/places/android-sdk/play-data-disclosure) the SDKs generate a pseudonymous, SDK-specific identifier to count daily active users, and send Google their own crash and diagnostic data. We never see that identifier, it is not tied to anything of ours, and we cannot read it back; it is declared in the Play Data safety form as collected by Google. Added 2026-09-16.

Until 2026-09-15 this was not so: no released Android build carried a Google Maps key, no map was ever requested from Google from the app, and the app drew its own blank canvas instead, with the route, the shade and the markers in their correct relative positions and a visible label saying there was no base map. The previous version of this section promised that the day a key was added would be recorded here. That day is 2026-09-15, with version 0.2.0; §17 records the change.

In the browser, in the Google stack, the base map is already Google's: it is drawn by the Google Maps JavaScript API running in your browser, so Google receives your IP address and the map rectangle you are looking at, on every pan and every zoom, for as long as that stack is selected. In the fallback stack the browser's base map is not Google's — see the tile servers below.

Your use of a Google map is subject to the Google Maps/Google Earth Additional Terms of Service and the Google Privacy Policy. Those two links are already shown in the app's Data licences screen in every build.

For what your device sends Google for the map and the search, we answer together with Google. The Court of Justice of the EU has held (Fashion ID, 2019) that whoever embeds another company's service in their app or page decides, together with that company, that your data is collected and transmitted to it, and is therefore jointly responsible for that step; for what the other company does with the data afterwards, it alone is responsible. So for the Google Maps map and the Google Places search — the SDK in the app and the JavaScript API in the browser — we are joint controllers with Google of your IP address, the map area and, if you search, the text and the ranking coordinate reaching Google. Our basis for that transmission is our legitimate interest in showing you a working map and an address search (§9), and what triggers it is something you do: opening or moving the map, or typing in the search box. What Google does with that data afterwards remains Google's own business, as its own controller and under its own policy.

Distribution. Lightshadow is distributed through Google Play, which gives us only aggregate, anonymous install and crash statistics that we cannot trace to a person.

A tile server — active today, in the browser. In the fallback stack the web client draws its base map as vector tiles that your browser fetches directly from tiles.openfreemap.org, which is operated by OpenFreeMap. That request never touches our server, so the tile server receives your IP address and which tiles you asked for — which is to say, roughly where you are looking and at what zoom — every time you pan or zoom. Nothing you typed goes with it, and there is no account and no identifier in the request: it carries the tile numbers and nothing else.

Until 2026-09-14 this text named tile.openstreetmap.org, run by the OpenStreetMap Foundation, and that was correct at the time. The web client moved to a vector base map that day and the sentence was left behind for a few hours, naming the wrong company as the recipient of your address. Corrected here rather than quietly.

What we have not checked, and say so rather than implying otherwise: how long OpenFreeMap keeps request logs, and what it does with them. We chose it because it requires no account and no key, not because we have audited it. The map DATA is still OpenStreetMap's, under ODbL, and that credit is unchanged — the data and the server that hands you the tiles are two different obligations, and only the server changed.

This has been true of the web client since it existed, and no version of this policy said so. It is written down here because it is a fact about the product, not because it changed — the Google stack merely put a second company in the same position and made the omission impossible to leave standing. The Android app fetches no OpenStreetMap tiles. This is a different thing from the OpenStreetMap data in the shade model, which we downloaded in advance; that is the last paragraph of this section.

Hosting. The Lightshadow server runs at Hetzner Online GmbH, Germany. The provider can technically reach the machine, as any host can; it is not given the data for any purpose of its own. Hetzner is our processor: it handles the data only on our behalf, under a data-processing agreement that obliges it to follow our instructions, to use the data for nothing of its own, to keep it confidential, to protect it with appropriate security measures, and to delete or return it when the service ends. That is the contract Article 28 GDPR requires.

E-mail. Messages from the contact form (§5.6) arrive in a Google Workspace mailbox, Google's e-mail service (Google Ireland Limited and Google LLC). For that mailbox Google is our processor: its data-processing terms for Google Workspace oblige it to handle the mail only to provide the service to us and on our instructions, not for purposes of its own such as advertising (Article 28 GDPR). Messages are deleted after 90 days (§10).

Nobody else. There is no analytics provider, no crash-reporting service, no advertising network, no attribution SDK and no customer-support tool.

And one sentence that used to stand here has been removed because it is no longer true. It read: "Address search is answered by Lightshadow's own street index on our own server; your search text is not forwarded to any outside service." That describes the fallback stack exactly, and it is false in the Google stack — where the text is not forwarded by us to anyone, for the simpler and larger reason that it never comes to us at all, and goes to Google instead. §17 records the change. It is not a narrowing of the old promise: it is the same promise pointing at a different company.

Data sources are not recipients. Lightshadow's shade model is built from OpenStreetMap, from the Instituto Geográfico Nacional's PNOA-LiDAR survey and from the Dirección General del Catastro. That data was downloaded by us in advance and is credited in the app because the licences require it. Nothing about you is ever sent to them.


9. Legal basis for each purpose

Lightshadow is operated from Spain, so the EU General Data Protection Regulation applies.

PurposeDataLawful basis
Computing the route, the shade layer and the coverage answer you asked forCoordinates, departure timeArt. 6(1)(b) — necessary to provide the service you requested
Answering an address search — fallback stack onlyThe text you typed, the ranking coordinateArt. 6(1)(b) — same
Keeping search text and coordinates to see which places and streets people actually ask about, and to improve the model and the coverageAnalytics store (§5.2)Art. 6(1)(f) — our legitimate interest in understanding and improving the service, balanced by holding these records with nothing that identifies the sender
Counting which cities are asked forMunicipality names and countsArt. 6(1)(f) — our legitimate interest in deciding which city to prepare next
Keeping the service up, debugging faults and limiting abuseOperational log (§5.1), rate-limit countersArt. 6(1)(f) — our legitimate interest in a service that works and is not abused
Answering what you write to us through the contact formName, e-mail address, topic and message (§5.6)Your request: you write to us, and answering is taking steps, at your request, towards a possible relationship with you (Art. 6(1)(b)). We ask for no separate consent: the processing consists of answering you, and it ends when we delete the message (§10)
Having your device send Google what the Google map and the Google search need — the transmission we answer for together with Google (§8)Your IP address, the map area and, if you search in the Google stack, the text and the ranking coordinateOur legitimate interest in offering you a working map and an address search, balanced by the transmission carrying no account or identifier of ours and happening only when you open the map or type in the search box (Art. 6(1)(f))
Fixing the app when it crashesCrash store (§5.5): stack trace, app version, Android version, phone model, timeArt. 6(1)(f) — our legitimate interest in an app that does not crash, balanced by holding the reports with nothing that identifies the phone or its owner

Your search text in the Google stack never reaches us: it travels from your device to Google, which answers for what it does with it under its own policy. All we answer for is that our app and our page send it to Google, and that is the row for the Google map and search. Corrected 2026-10-09: this paragraph said the table had no row for that search, because we cannot state a lawful basis for something we never receive. Under the ruling cited in §8, whoever embeds the service answers for the transmission even without receiving the data, so the transmission does need a basis.

The rate-limit counters that stop one address flooding the API do hold IP addresses, but only in the server's memory, for at most an hour, and they are never written to disk and are lost on every restart.

You can object to processing based on legitimate interest at any time — see §11 for what we can and cannot do about it.


10. How long it is kept

WhatHow long
Start/finish coordinates of a planned route, shade-layer rectanglesNot kept at all. They exist in memory for the length of the request
Rate-limit counters (including IP)In memory only; at most one hour, and gone on restart
Operational log (§5.1)30 days. This one is not enforced by Lightshadow's software but by the server's own log rotation — the system journal and the web server's log settings on the machine that hosts the API — which is configured to discard lines older than 30 days
Analytics store (§5.2)90 days. A row is deleted once the hour it was recorded in is more than 90 days old. The server does this itself, when it starts and then once a day
City-request counters (§5.3)Hourly counts: 365 days, deleted the same way. The total per municipality — a name and a number, with no time in it — is kept indefinitely
Crash store (§5.5)90 days. A report is deleted once the hour it arrived in is more than 90 days old, by the same daily run
Contact-form messages (§5.6)Nothing on the server. In the mailbox, 90 days; then deleted
The text you type in the Google stackNothing exists on our side to keep. What Google keeps of it is governed by Google's privacy policy
The map tiles your browser fetches (fallback stack, browser)Nothing on our side; the request never reaches our server
Anything on your phone (§3), and the same things in your browserUntil you delete it, uninstall Lightshadow, or clear the site's data

Stated plainly: the periods above are enforced by the software itself, not by a procedure. The deletion runs when the server starts and then once a day, and it refuses to run — and says so in the server's log — if a fault such as a wrong clock would make it delete more than half of a store at once; a refusal keeps everything until a person looks. The 30 days for the operational log is the one period the software does not enforce itself: once a line is written it belongs to the server's journal, and it is the server's log rotation that discards it.


11. Your rights, and the honest limit on them

Under the GDPR you have the right to access your personal data, to have it corrected or erased, to restrict or object to its processing, to data portability, and to lodge a complaint with a supervisory authority.

Here is the awkward part, stated rather than hidden. Lightshadow keeps nothing that identifies you. There is no account, no device identifier, no IP address next to the stored data and no session key. If you write and ask what we hold about you, we cannot find it, because there is nothing to search by — a stored search query and a coordinate look identical whoever sent them.

Article 11(2) GDPR covers exactly this situation: where a controller can show it is not in a position to identify the data subject, the rights of access, rectification, erasure, restriction, notification and portability (Articles 15 to 20) do not apply, unless you provide additional information that makes identification possible. We do not ask for such information, we do not want it, and providing it would mean handing us more data than we hold today.

There is one exception: contact-form messages. There we do know who you are, because you gave us your name and your address, and the limit above does not apply. If you wrote to us, you can see that message, have it corrected or ask us to delete it before the 90 days are up: write to us from the same e-mail address and we will look it up by that address.

What you can do, effectively and immediately:

This limitation is a consequence of holding as little as possible. It is not a way of avoiding a request.


12. Children

Lightshadow is not directed at children, offers nothing designed for them and collects no age information. Because it has no accounts, it also has nothing to delete from a child's account. If you believe a child's personal data has somehow reached us, write to info@lightshadow.es and we will look into it — while noting that §11 applies to us equally here.


13. Advertising, tracking and sale of data

These four statements are about Lightshadow. What Google does with what your own device sends it directly (§8) is governed by Google's privacy policy: we receive none of it, we are paid nothing for it, and we cannot switch it off on your behalf. The one thing you can do inside Lightshadow is not type in the search box — tapping the map sets a point without sending anything to Google.


14. Not a medical device

Lightshadow is not a health app and is not a medical device. It does not diagnose, treat, cure or prevent any condition, and it processes no health data whatsoever. Lightshadow never measures anything about your body and holds no special-category data of any kind.

Lightshadow shows no ultraviolet figure of any kind, and no figure about sun exposure beyond how much of a route is modelled as shaded. Removed from this section on 2026-09-14: it described a feature that does not exist. The service returns uv: null (route_service.py), no client reads that field, and no such string ships in either language. If an ultraviolet figure is ever built, this section has to be rewritten before it ships, and design §7C governs how it may be worded.


15. Where your data is processed

The Lightshadow server is hosted at Hetzner Online GmbH, Germany. Germany is inside the European Economic Area, so the data described in §5 is not transferred outside it.

Transfers to the United States. Google LLC, the US company of the Google group, may receive in the US what your device sends Google for the map and the search (§8), and the contact-form mail kept in Google Workspace (§5.6). Google LLC is certified under the EU-US Data Privacy Framework: the European Commission has decided that companies certified under it protect personal data at a level equivalent to the EU's, so data may be transferred to them without further safeguards (adequacy decision of 10 July 2023, Article 45 GDPR). Google LLC's certification can be checked at https://www.dataprivacyframework.gov/.

Google's involvement (§8) is governed by Google's own terms and privacy policy, including any transfers Google makes. In the Google stack that involvement includes the text you type and the map you are looking at, sent from your device to Google rather than by us. We answer together with Google for that transmission taking place (§8); we are not a party to what Google transfers afterwards and cannot place conditions on it. The same is true of the tile requests your browser makes to OpenFreeMap in the fallback stack.


16. Security

No system is perfectly secure, and Lightshadow is operated by one person. This policy describes the measures that exist, not measures that are planned.


17. Changes to this policy

If what Lightshadow does changes, this policy changes with it, and the date at the top is updated. The current version is always at https://lightshadow.app/legal/privacy/, and the app links to it from the first-run screen and from Settings.

2026-10-09 — a contact form, and three clarifications about Google and hosting

The contact form is new processing. From today the site has a contact form. What you write in it — name, e-mail address, topic and message — is forwarded to us by e-mail and not kept on the server; the mailbox, at Google Workspace, deletes it after 90 days. It is the first time Lightshadow handles your name and your e-mail address, and only if you choose to write, so it is recorded here as a widening. The row in §4, §5.6 and the rows in §9 and §10 are the full account, and §11 says how to exercise your rights over a message.

Three clarifications that do not change what the software does. §8 now says that, for what your device sends Google for the map and the search, we answer together with Google, and §9 gives the lawful basis for that transmission; it used to say Google was the only controller and there was no basis to state. §15 says why Google LLC may receive data in the US. And §8 says that Hetzner, which hosts the server, is a processor under a contract that obliges it to handle the data only on our behalf.

2026-09-16 — recent searches, on the phone only

From Android 0.2.4 the app keeps the last ten places you picked from a search — our name for the point and its coordinate — on the phone, so the search box can offer them back. Nothing is sent anywhere; the list is cleared from Settings → Clear search history and goes with the app. It never holds the text you typed or anything Google returned. The row in §3 is the full account.

2026-09-16 — a place picked from Google's search is named after our own street

In the Google stack the name Google gives a place may not be shown on the map, so the app used to label a picked point with the words you had typed. From Android 0.2.4 it sends the picked place's coordinate to the Lightshadow server and labels the point with the nearest OpenStreetMap street name from our own data, when one is within 60 metres; otherwise your typed words, as before. This is one coordinate reaching us that in the Google stack did not before — recorded here as a widening. The call stores nothing: no row is written for it. The same coordinate was already stored, rounded to about 100 metres, the moment you set the point (§4, §5), so nothing new is kept. The row in §4 is the full account.

2026-09-16 — the app reports its own crashes, to us

Until this version the app reported nothing when it crashed: the fault was gone with the process and we learned of it only if someone wrote to us. From the first build released after 0.2.1 the app sends a crash report to the Lightshadow server — the stack trace, the app version, the Android version, the phone model and the time — and the server keeps it for 90 days with the hour it arrived. This is new data leaving your phone, so it is recorded here as a widening, not as a repair. What was decided about it, and why: the report goes to our own server and to no crash-reporting company — the usual alternative would have put an installation identifier next to every trace, and an identifier next to a trace is a record of what one phone was doing; ours carries no identifier at all, and the server refuses a report that tries to send one. The row in §4, §5.5, and the rows in §9 and §10 are the full account.

2026-09-15 — the Android app shows Google Maps

Until this version, no released Android build carried a Google Maps key: the app drew a blank canvas, and this policy said Google received nothing through the app's map. The build distributed from lightshadow.app — version 0.2.0 and every later one — shows a Google Maps base map. So, from the app as well as from the browser, Google receives your IP address and the map area you look at, on every pan and every zoom, under Google's own privacy policy. This is a real widening of what leaves your phone, not a repaired omission: the previous text was true when written and stopped being true with this release. What has not changed: no account, no identifier, no search text in a map request, and nothing about the map you look at reaching our server beyond the viewport already described in §4. §2 and §8 say the same in full.

2026-09-14 — a fourth file on the server is named

§5 opened with "The server writes to three places, and only three", and listed three. That count was a promise about files, and a fourth file had appeared: a per-month counter of how many times each Google product we pay for has been used, added the same day as the Google stack itself. It holds a product identifier and a number and nothing else — no request, no coordinate, no search text, no IP address, no identifier, and no time finer than the calendar month — so nothing about you became less private. What was wrong was the enumeration: a policy that says "and only three" has to be complete, and this one was counting the stores that hold your data while promising a count of every file. The sentence now says three kinds of record about a request, and the counter is written up as §5.4 so nobody has to take our word for what is in it. Nothing you gave up; an omission repaired.

2026-09-14 — the search can now go to Google, and the web client is disclosed

Two changes, one of which is a real widening of what leaves your hands and one of which is an omission being repaired.

The search. Lightshadow can now run in either of two configurations, and the server chooses. In the Google stack the address search is Google's and the map may be Google's, so your browser or your phone contacts Google directly and Google receives your IP address, the map you are looking at and the text you type. In the fallback stack everything is as it was: our own street index answers the search, and the text reaches us and is stored as §5.2 describes. You cannot pick a stack, and neither can the app.

The web client. This policy described only the mobile app. It now covers the browser client as well — which matters immediately, because in the fallback stack that client has always fetched its map tiles straight from a third party's servers, so those servers have always received the visitor's IP address and viewport. That third party was the OpenStreetMap Foundation until 14 September 2026 and is OpenFreeMap since. What changed today is that it is finally written down.

BeforeNow
Where the text you type goesTo our server, always, and nowhere elseTo Google, whenever the server has selected the Google stack. To our server in the fallback stack, as before
Who can read the text you typeUsGoogle or us — never both, and you do not choose which
Who receives your IP address and the part of the map you are looking atNot stated anywhere. In the browser it was already a tile host — the OpenStreetMap FoundationGoogle in the Google stack; OpenFreeMap in the browser in the fallback stack. Stated now; that a tile host received it was already true, but the host itself changed on 14 September 2026
What this policy coversThe Android app and our serverThe Android app, the web client, and our server
An account, a profile, a device identifier, background location, a recorded trackNone of themNone of them
Your continuous position while you look at the mapNever leaves the device or the browserNever leaves the device or the browser
A coordinate reaching our serverOnly by a deliberate act: a tap on the map, a search, or "use my location"Unchanged
Asking for a city we do not coverA counter per municipality, never a coordinateUnchanged

What you gave up. Until today, the honest one-line summary of address search was that what you typed never left our hands. In the Google stack that is no longer true, and it is not the same promise made smaller — it is the same promise pointed at a different company, one that already knows far more about you than we ever will. There is no setting that avoids it, because the stack is the server's choice and not yours. What has not changed is everything in the table above that says "unchanged": no account, no identifier, no background location, no recorded track, and a continuous position that still never leaves your device.

2026-09-14 — the location promise was narrowed

Until this version, this policy and the text inside the app said that Lightshadow never follows a walk. That sentence was written to rule out three things: location while the app is closed, a recorded track, and a location history. All three are still ruled out, in §3, §6 and §7.

But the sentence also ruled out a fourth thing by accident — a map that keeps up with you while you are looking at it, with your position never leaving the device — and that is something Lightshadow is being built to do. So the promise has been narrowed rather than restated, and the honest summary of the exchange is:

BeforeNow
Reading your position while a screen is openOnce per thing you asked forRepeatedly, while you are looking at the map
Location while the app is closedNeverNever
A track of where you went, stored anywhereNeverNever
A continuously sampled position sent to our serverNeverNever — the server gets the two ends of a route, a point you set, and a search query
Anything that would tie one position of yours to the nextNoneNone

What you gave up. A reader of the old sentence could reasonably conclude that Lightshadow asks your phone where you are only at the moment you press something. That is no longer true, and we are not going to pretend it is. What has not changed is where those positions can go, which is nowhere.


18. Contact

Nikita Khromushkin info@lightshadow.es Spain

Supervisory authority: Agencia Española de Protección de Datos (AEPD), https://sedeaepd.gob.es/sede-electronica/home