CLAUDE.md — Restoni Properties

Operating context for Claude Code on this repo. Read it at the start of every session opened in this folder.


0. This project is not Joba — read this first

restoniproperties is a standalone project. It has no relationship to the Joba job platform (d:\WebProjects-CLEAN\joba), to dionysistsipiras, or to any other repo on this machine.

None of Joba's rules apply here. Specifically:

Why this section exists: for a period both repos were open in a single multi-root VS Code workspace, which put them in one Claude session sharing one set of project instructions and one memory store. On 01/08/2026 a "wrap up" typed while working on Restoni triggered Joba's database backup script. Since 02/08/2026 each project opens in its own VS Code window. If you ever find both folders in scope again: never run one project's script from another project's context, and confirm which project a command targets before acting on any standing rule.


1. What this is

Restoni (restoni.com) — premium short-term vacation rentals in Greece across Mykonos, Tinos, the Athenian Riviera and the Peloponnese. Villas, apartments and stays booked direct rather than through an OTA ("Why book direct", "Best price guaranteed" are recurring page themes).


2. Build

npm run build    # eleventy && node tools/build-greek.js
npm run serve    # eleventy --serve
npm run check    # node tools/voice-check.js — copy rules, see §3

Run npm run check after touching any Greek copy. It reads both tools/translations.json and the legacy GR dictionary in js/main.js, and fails (exit 1) on second-person singular or on an em dash. It exists because both rules had already been broken once each: four strings had slipped into «εσύ», and js/main.js was never in strip-emdash.js's sweep list, so its keys had drifted away from the swept HTML.

The Greek site is generated at build time, not authored by hand — the build is two steps and the second one is not optional. Netlify runs the same pair (npx @11ty/eleventy && node tools/build-greek.js). If you change the build command in one place, change it in the other.


3. Language & voice

English is primary. Greek lives at /gr/… and is generated (see §4).

Greek uses the formal plural (πληθυντικός ευγενείας)

«Ανακαλύψτε», «σας προσφέρει», «Αξιοποιήστε στο έπακρο το ακίνητό σας», «Κλείστε απευθείας μαζί μας». Never the informal singular.

Why: these are luxury short-term rentals for an international audience, where distance reads as respect and professionalism. Joba mandates the opposite («εσύ») — do not carry that habit across.

Property names stay in English, in every language

«Villa Irilia», «Tinos Olive Mill House», «Blue Studio», «Aloria Mansion» — never «Βίλα Ιρίλια». They are brand names, not descriptions. Owner rule, 01/08/2026.

This has broken before: tools/build-greek.js does global exact-match replacement on text nodes, and because titles are split across elements (<h1>Tinos <em>Olive Mill House</em></h1>), the «Tinos» that correctly translates as a destination in the menu also fired inside the property name, producing «Τήνος Olive Mill House» and «Αθηναϊκή Ριβιέρα Lux Flat».

How to keep it fixed:

No em dashes in visitor-facing copy

No «—» in any visitor-visible string, Greek or English: prose, meta descriptions, placeholders, alt text. Use a comma, period, colon, parentheses, or «·». En dash «–» is fine for ranges (2–4 guests). Code comments are exempt.

tools/strip-emdash.js sweeps root *.html, _includes/**, content/**, tools/translations.json και llms.txt if the rule slips.

Prefer complete, warm, conversational sentences over compressed fragments.


4. The Greek /gr/ build

Full design and rationale: docs/greek-seo-build-plan.md. The short version:

The site was bilingual only for visitors — a JS dictionary in js/main.js swapped text on one English URL, which Google cannot see, so Greek search traffic was zero. The fix generates real, indexable Greek pages at restoni.com/gr/….

Coverage is not complete. Untranslated strings produce mixed-language pages, which is worse than English-only for both UX and SEO. tools/untranslated-report.txt is the running audit — regenerate it from a current build rather than trusting an old copy, and check the wave checklist in the build plan (it lags behind the commits).

Owner review before anything Greek goes live — the owner's decision was to ship the Greek set all at once, after review.


5. Encoding — everything is UTF-8, and Windows fights this

Greek text lives in tools/translations.json, the generated /gr/ pages and parts of the source. A mangled encoding destroys real user-facing text while the build still passes.


6. What "wrap up" means in this repo

Commit and push. That is all.

There is no database, no scripts/ directory and no backup script in this project. node scripts/backup.mjs belongs to Joba and must never be run from here. If a wrap up seems to call for a backup, the answer is no — the entire project is in git, and git is the backup.

Sensible wrap up: run npm run build if the build could be affected, commit with a clear message, push to origin main.


7. Docs in this repo

Update the relevant doc in the same commit as the work it describes.


Created 02/08/2026, after Joba's rules leaked into this project through a shared multi-root workspace. Extend it whenever a decision here is settled.