Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,11 @@ section.
and Chromium's client hints, and a value the sender wrote is only taken
where it is one of a known few. Matching stays linear in the length of an
agent: no backtracking expression ever reads one.
- **A visitor is a person who opened a page - decided by the owner.** One
the classifier takes for a browser and whose visit was a page view,
counted once a day with the first page they opened. A request for anything
else - a script, an API call, `robots.txt`, a path that was not there -
makes nobody a visitor, so there are never more visitors than page views.
- **Nothing that names a visitor is kept.** Counts only; the referrer as its
host; visitors told apart for a day by a hash under a random key per day
and lambda, held in memory and never written. No cookie, no script in the
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -865,8 +865,10 @@ feature's preview.
500 characters of an agent are read.
- **Visitors without keeping anybody.** A visitor is their address and their
agent, hashed with a key made at random per day and lambda, held in memory
for today and yesterday only (`DailyVisitors`), and only a person is one.
So a visitor counts once a day; a restart counts somebody again who comes back the same day, and an
for today and yesterday only (`DailyVisitors`), and only a person who
opened a page is one: a request for anything else - a script, an API call,
a path a scanner guessed - makes nobody a visitor, whatever agent it names,
so there are never more visitors than page views. So a visitor counts once a day; a restart counts somebody again who comes back the same day, and an
installation that keeps no addresses (`LAMBDA_LOG_CLIENT_ADDRESS=false`)
counts no visitors. No cookie, no script in the lambda.
- **A database of its own.** `analytics.db` beside `lambda.db`, a star:
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/de/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const analytics: EditorMessages['analytics'] = {
premiumRange: 'Premium zeigt bis zu einem Jahr',

visitors: 'Besucher',
visitorsHint: 'Verschiedene Personen, jede einmal pro Tag gezählt. Suchmaschinen und andere Programme sind keine Besucher.',
visitorsHint: 'Verschiedene Personen, die eine Seite geöffnet haben, jede einmal pro Tag gezählt. Suchmaschinen und andere Programme sind keine Besucher.',
views: 'Seitenaufrufe',
viewsHint: 'Jedes Mal, wenn jemand eine Seite geöffnet hat.',
hits: 'Requests',
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/de/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ export const guide: Messages['guide'] = {
<>
Gezählt wird von der Plattform, vor Ihrer App – Ihre App braucht dafür nichts: keine Cookies, kein Script, kein Banner,
das Ihre Besucher akzeptieren müssten. Gespeichert werden nur Zahlen pro Tag – nie eine Adresse, und von der Seite, von
der jemand kam, nur die Website. Ein Besucher ist eine Person, einmal pro Tag gezählt: Suchmaschinen, KI-Crawler und
der jemand kam, nur die Website. Ein Besucher ist eine Person, die eine Seite geöffnet hat, einmal pro Tag gezählt: Suchmaschinen, KI-Crawler und
andere Programme werden getrennt gezählt, nach Art, und Google, Bing, OpenAI, Apple und Perplexity nur dann mit Namen,
wenn der Besuch von einer Adresse kam, die sie veröffentlichen – jeder kann behaupten, sie zu sein. Ein Jahr wird
aufbewahrt; eine kostenlose App zeigt davon die letzten sieben Tage und {k.b('Premium')} alles, auch was vorher gezählt
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/en/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export const analytics = {

/** The figures at the top; each one picks what the chart below shows. */
visitors: 'Visitors',
visitorsHint: 'Different people, each counted once a day. Search engines and other programs are not visitors.',
visitorsHint: 'Different people who opened a page, each counted once a day. Search engines and other programs are not visitors.',
views: 'Page views',
viewsHint: 'Every time somebody opened a page.',
hits: 'Requests',
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/en/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,7 @@ export const guide = {
<>
It is counted by the platform, in front of your app, so your app needs nothing for it: no cookies, no script,
no banner for your visitors to accept. Only counts per day are kept - never an address, and of the page somebody
came from only the site. A visitor is a person, counted once a day: search engines, AI crawlers and other
came from only the site. A visitor is a person who opened a page, counted once a day: search engines, AI crawlers and other
programs are counted apart, by what they are, and Google, Bing, OpenAI, Apple and Perplexity only by name when
the visit came from an address they publish - anybody can claim to be them. A year is kept; a free app shows the last seven
days of it and {k.b('Premium')} all of it, what was counted before included. Switching it off deletes what was
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/es/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const analytics: EditorMessages['analytics'] = {
premiumRange: 'Premium muestra hasta un año',

visitors: 'Visitantes',
visitorsHint: 'Personas distintas, cada una contada una vez al día. Los buscadores y otros programas no son visitantes.',
visitorsHint: 'Personas distintas que abrieron una página, cada una contada una vez al día. Los buscadores y otros programas no son visitantes.',
views: 'Visualizaciones de página',
viewsHint: 'Cada vez que alguien abrió una página.',
hits: 'Peticiones',
Expand Down
10 changes: 5 additions & 5 deletions src/Frontend/src/locales/es/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -508,11 +508,11 @@ export const guide: Messages['guide'] = {
<>
La cuenta la lleva la plataforma, delante de tu app, así que tu app no necesita nada para ello: ni cookies, ni
scripts, ni avisos que tus visitantes tengan que aceptar. Solo se guardan recuentos por día, nunca una dirección,
y de la página de la que alguien viene solo se guarda el sitio. Un visitante es una persona, contada una vez al
día: los buscadores, los rastreadores de IA y otros programas se cuentan aparte, según lo que son, y Google, Bing,
OpenAI, Apple y Perplexity solo se nombran cuando la visita llegó desde una dirección que ellos publican: cualquiera
puede decir que es uno de ellos. Se guarda un año: una app gratuita muestra los últimos siete días y {k.b('Premium')}
todo, incluido lo contado antes. Al desactivarla se borra lo contado.
y de la página de la que alguien viene solo se guarda el sitio. Un visitante es una persona que abrió una página,
contada una vez al día: los buscadores, los rastreadores de IA y otros programas se cuentan aparte, según lo que
son, y Google, Bing, OpenAI, Apple y Perplexity solo se nombran cuando la visita llegó desde una dirección que
ellos publican: cualquiera puede decir que es uno de ellos. Se guarda un año: una app gratuita muestra los últimos
siete días y {k.b('Premium')} todo, incluido lo contado antes. Al desactivarla se borra lo contado.
</>
),
visitorsAside:
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/fr/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const analytics: EditorMessages['analytics'] = {
premiumRange: 'Premium affiche jusqu’à un an',

visitors: 'Visiteurs',
visitorsHint: 'Personnes différentes, chacune comptée une fois par jour. Les moteurs de recherche et les autres programmes ne sont pas des visiteurs.',
visitorsHint: 'Personnes différentes ayant ouvert une page, chacune comptée une fois par jour. Les moteurs de recherche et les autres programmes ne sont pas des visiteurs.',
views: 'Pages vues',
viewsHint: 'Chaque fois que quelqu’un a ouvert une page.',
hits: 'Requêtes',
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/fr/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,7 @@ export const guide: Messages['guide'] = {
Le comptage est fait par la plateforme, en amont de votre application, qui n’a donc besoin de rien : pas de
cookies, pas de script, pas de bannière à faire accepter à vos visiteurs. Seuls des totaux par jour sont
conservés - jamais une adresse, et de la page d’où quelqu’un est venu, seulement le site. Un visiteur est une
personne, comptée une fois par jour : les moteurs de recherche, les robots d’exploration IA et les autres
personne ayant ouvert une page, comptée une fois par jour : les moteurs de recherche, les robots d’exploration IA et les autres
programmes sont comptés à part, selon ce qu’ils sont, et Google, Bing, OpenAI, Apple et Perplexity ne sont
nommés que si la visite provient d’une adresse qu’ils publient : n’importe qui peut se faire passer pour eux.
Un an est conservé ; une application gratuite en montre les sept derniers jours et{' '}
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/id/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const analytics: EditorMessages['analytics'] = {
premiumRange: 'Premium menampilkan hingga setahun',

visitors: 'Pengunjung',
visitorsHint: 'Orang yang berbeda, masing-masing dihitung sekali sehari. Mesin pencari dan program lain bukan pengunjung.',
visitorsHint: 'Orang yang berbeda yang membuka sebuah halaman, masing-masing dihitung sekali sehari. Mesin pencari dan program lain bukan pengunjung.',
views: 'Tampilan halaman',
viewsHint: 'Setiap kali seseorang membuka sebuah halaman.',
hits: 'Request',
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/id/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ export const guide: Messages['guide'] = {
Penghitungan dilakukan oleh platform, di depan aplikasi Anda, sehingga aplikasi Anda tidak memerlukan apa pun
untuk itu: tanpa cookie, tanpa skrip, tanpa banner yang harus disetujui pengunjung Anda. Hanya jumlah per hari
yang disimpan - tidak pernah alamat, dan dari halaman asal seorang pengunjung hanya situsnya. Pengunjung adalah
seseorang yang dihitung sekali sehari: mesin pencari, crawler AI, dan program lain dihitung terpisah menurut
seseorang yang membuka sebuah halaman, dihitung sekali sehari: mesin pencari, crawler AI, dan program lain dihitung terpisah menurut
jenisnya, dan Google, Bing, OpenAI, Apple, dan Perplexity hanya disebut namanya jika kunjungan berasal dari
alamat yang mereka publikasikan - siapa pun bisa mengaku sebagai mereka. Data disimpan selama setahun; aplikasi
gratis menampilkan tujuh hari terakhir darinya dan {k.b('Premium')} menampilkan semuanya, termasuk yang dihitung
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/it/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const analytics: EditorMessages['analytics'] = {
premiumRange: 'Premium mostra fino a un anno',

visitors: 'Visitatori',
visitorsHint: 'Persone diverse, ognuna contata una volta al giorno. I motori di ricerca e gli altri programmi non sono visitatori.',
visitorsHint: 'Persone diverse che hanno aperto una pagina, ognuna contata una volta al giorno. I motori di ricerca e gli altri programmi non sono visitatori.',
views: 'Visualizzazioni di pagina',
viewsHint: 'Ogni volta che qualcuno ha aperto una pagina.',
hits: 'Richieste',
Expand Down
11 changes: 6 additions & 5 deletions src/Frontend/src/locales/it/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -509,11 +509,12 @@ export const guide: Messages['guide'] = {
<>
Lo conta la piattaforma, davanti alla tua app, quindi alla tua app non serve nulla: niente cookie, niente script,
nessun banner che i visitatori debbano accettare. Si conservano solo i conteggi per giorno: mai un indirizzo e,
della pagina da cui qualcuno è arrivato, solo il sito. Un visitatore è una persona, contata una volta al giorno: i
motori di ricerca, i crawler IA e gli altri programmi vengono contati a parte, per ciò che sono, e Google, Bing,
OpenAI, Apple e Perplexity solo per nome quando la visita arriva da un indirizzo che pubblicano: chiunque può
dichiararsi uno di loro. Si conserva un anno: un’app gratuita ne mostra gli ultimi sette giorni e {k.b('Premium')}
tutto, anche ciò che è stato contato prima. Disattivandolo, ciò che è stato contato viene eliminato.
della pagina da cui qualcuno è arrivato, solo il sito. Un visitatore è una persona che ha aperto una pagina, contata
una volta al giorno: i motori di ricerca, i crawler IA e gli altri programmi vengono contati a parte, per ciò che
sono, e Google, Bing, OpenAI, Apple e Perplexity solo per nome quando la visita arriva da un indirizzo che
pubblicano: chiunque può dichiararsi uno di loro. Si conserva un anno: un’app gratuita ne mostra gli ultimi sette
giorni e {k.b('Premium')} tutto, anche ciò che è stato contato prima. Disattivandolo, ciò che è stato contato viene
eliminato.
</>
)),
visitorsAside:
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/ja/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export const analytics: EditorMessages['analytics'] = {

/** The figures at the top; each one picks what the chart below shows. */
visitors: '訪問者',
visitorsHint: 'ユニークな訪問者数です。同じ人は1日に1回だけ数えます。検索エンジンやその他のプログラムは訪問者に含めません。',
visitorsHint: 'ページを開いたユニークな訪問者数です。同じ人は1日に1回だけ数えます。検索エンジンやその他のプログラムは訪問者に含めません。',
views: 'ページビュー',
viewsHint: 'ページが開かれた回数です。',
hits: 'リクエスト',
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/ja/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ export const guide: Messages['guide'] = {
)),
visitors2: ((k) => (
<>
集計はアプリの手前でプラットフォームが行うので、アプリ側で必要なことはありません。Cookieも、スクリプトも、訪問者が同意するバナーも不要です。保存するのは日ごとの数だけで、IPアドレスは保存せず、訪問元のページについてもサイトだけを記録します。訪問者とは人のことで、1日に1回だけ数えます。検索エンジン、AIクローラー、その他のプログラムは、種類別に分けて別に集計します。Google、Bing、OpenAI、Apple、Perplexityは、それぞれが公開しているアドレスからの訪問だった場合にのみ名前で表示します。誰でもこれらを名乗れるためです。保存期間は1年で、無料のアプリでは直近7日間を表示し、{k.b('プレミアム')}ならそれ以前に集計した分も含めてすべて表示します。オフにすると、集計したものは削除されます。
集計はアプリの手前でプラットフォームが行うので、アプリ側で必要なことはありません。Cookieも、スクリプトも、訪問者が同意するバナーも不要です。保存するのは日ごとの数だけで、IPアドレスは保存せず、訪問元のページについてもサイトだけを記録します。訪問者とは、ページを開いた人のことで、1日に1回だけ数えます。検索エンジン、AIクローラー、その他のプログラムは、種類別に分けて別に集計します。Google、Bing、OpenAI、Apple、Perplexityは、それぞれが公開しているアドレスからの訪問だった場合にのみ名前で表示します。誰でもこれらを名乗れるためです。保存期間は1年で、無料のアプリでは直近7日間を表示し、{k.b('プレミアム')}ならそれ以前に集計した分も含めてすべて表示します。オフにすると、集計したものは削除されます。
</>
)),
visitorsAside:
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/ko/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const analytics: EditorMessages['analytics'] = {
premiumRange: '프리미엄에서는 최대 1년까지 볼 수 있어요',

visitors: '방문자',
visitorsHint: '서로 다른 사람을 하루에 한 번씩 세어요. 검색 엔진과 그 밖의 프로그램은 방문자가 아니에요.',
visitorsHint: '페이지를 연 서로 다른 사람을 하루에 한 번씩 세어요. 검색 엔진과 그 밖의 프로그램은 방문자가 아니에요.',
views: '페이지 조회수',
viewsHint: '누군가 페이지를 열 때마다 세어요.',
hits: '요청',
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/ko/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ export const guide: Messages['guide'] = {
<>
집계는 플랫폼이 앱 앞에서 하기 때문에 앱에는 아무것도 필요 없어요. 쿠키도, 스크립트도, 방문자가 동의할
배너도 없어요. 하루 단위의 횟수만 저장하고, 주소는 저장하지 않으며, 방문자가 어디에서 왔는지도 사이트만
남겨요. 방문자는 한 사람을 뜻하고 하루에 한 번만 세어요. 검색 엔진, AI 크롤러, 그 밖의 프로그램은 종류별로
남겨요. 방문자는 페이지를 연 사람을 뜻하고 하루에 한 번만 세어요. 검색 엔진, AI 크롤러, 그 밖의 프로그램은 종류별로
따로 세고, Google, Bing, OpenAI, Apple, Perplexity는 해당 업체가 공개한 주소에서 방문했을 때만 이름으로
표시해요. 누구나 이들을 사칭할 수 있기 때문이에요. 1년 치를 보관하고, 무료 앱은 그중 최근 7일을,
{k.b('프리미엄')}은 그 전에 집계한 것까지 전부 보여 줘요. 끄면 집계한 내용이 삭제돼요.
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/nl/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const analytics: EditorMessages['analytics'] = {
premiumRange: 'Premium toont tot een jaar',

visitors: 'Bezoekers',
visitorsHint: 'Verschillende mensen, elk één keer per dag geteld. Zoekmachines en andere programma’s zijn geen bezoekers.',
visitorsHint: 'Verschillende mensen die een pagina hebben geopend, elk één keer per dag geteld. Zoekmachines en andere programma’s zijn geen bezoekers.',
views: 'Paginaweergaven',
viewsHint: 'Elke keer dat iemand een pagina opende.',
hits: 'Requests',
Expand Down
10 changes: 5 additions & 5 deletions src/Frontend/src/locales/nl/guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -517,11 +517,11 @@ export const guide: Messages['guide'] = {
<>
Het wordt geteld door het platform, vóór je app, dus je app heeft er niets voor nodig: geen cookies, geen script,
geen banner die je bezoekers moeten accepteren. Alleen aantallen per dag worden bewaard – nooit een adres, en van
de pagina waar iemand vandaan kwam alleen de site. Een bezoeker is een persoon, één keer per dag geteld:
zoekmachines, AI-crawlers en andere programma’s worden apart geteld, per soort, en Google, Bing, OpenAI, Apple en
Perplexity alleen bij naam als het bezoek van een door hen gepubliceerd adres kwam – iedereen kan zich als hen
voordoen. Een jaar wordt bewaard; een gratis app toont daarvan de laatste zeven dagen en {k.b('Premium')} alles,
ook wat eerder geteld is. Als je het uitzet, wordt wat geteld was verwijderd.
de pagina waar iemand vandaan kwam alleen de site. Een bezoeker is een persoon die een pagina heeft geopend, één
keer per dag geteld: zoekmachines, AI-crawlers en andere programma’s worden apart geteld, per soort, en Google,
Bing, OpenAI, Apple en Perplexity alleen bij naam als het bezoek van een door hen gepubliceerd adres kwam –
iedereen kan zich als hen voordoen. Een jaar wordt bewaard; een gratis app toont daarvan de laatste zeven dagen en
{k.b('Premium')} alles, ook wat eerder geteld is. Als je het uitzet, wordt wat geteld was verwijderd.
</>
)),
visitorsAside:
Expand Down
2 changes: 1 addition & 1 deletion src/Frontend/src/locales/pl/editor/analytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const analytics: EditorMessages['analytics'] = {
premiumRange: 'Premium pokazuje do roku',

visitors: 'Odwiedzający',
visitorsHint: 'Różne osoby, każda liczona raz dziennie. Wyszukiwarki i inne programy nie są odwiedzającymi.',
visitorsHint: 'Różne osoby, które otworzyły stronę, każda liczona raz dziennie. Wyszukiwarki i inne programy nie są odwiedzającymi.',
views: 'Odsłony stron',
viewsHint: 'Za każdym razem, gdy ktoś otworzył stronę.',
hits: 'Żądania',
Expand Down
Loading
Loading