alicedennis.net: a teacher's website
A site for a piano and singing teacher. It replaced one that was broken. She updates it herself.
Who it is for
A piano and singing teacher in West Cornwall.
The problem
Her old website was broken. Search results still pointed people at its old addresses.
What I built
A new site with a page for each thing people look for: piano lessons, singing lessons, a gallery, how to find her and how to get in touch.
It has its own editing page. She signs in with her Google account and changes the words, the photos and the reviews herself. Lesson lengths are entered once and appear on every page that needs them.
Photos she adds are made smaller before they are sent, so the site stays quick.
The old site's addresses still work. Each one leads to the page that replaced it, so nobody arriving from a search result meets a dead end.
The contact form is guarded against junk in several ways. The rule I worked to: a lost enquiry costs her a pupil, and a junk message costs her ten seconds. So almost nothing is thrown away. A doubtful message is delivered with a label on it, not deleted.
What it does for her
She updates her own site. Nobody has to do it for her.
Where it is now
It has been live since September 2026.
What I did here
-
Websites you can update yourself
A small business website you update yourself. Change the words and pictures from a simple editing screen. Designed, built and kept running by me.
-
Hosting and care
Website hosting and care from the person who built it. Software kept up to date, security kept tight, and one person to call when something needs fixing.
-
Moving off WordPress
Moving your website off WordPress, with your content and web addresses kept. A smaller site your team can still edit, built and looked after by me.
For IT people
Site for a piano and singing teacher. Replaced a broken legacy site.
- A custom lightweight CMS with a built-in admin page and Google sign-in, so the owner edits it herself.
- One small Express 5 process. No database, no build step and no client framework: the content is one validated JSON file.
- Uploads are resized to WebP in the browser, so the server never decodes an image.
- Every page is server-rendered with its own title, description, canonical link and structured data. The old site's URLs get a 301 to the page that replaced them.
- Contact form: honeypot, signed timing cookie, rate limits, content scoring and blocklists. Suspect mail is flagged, not dropped.
- Deployed by GitHub Actions after lint and tests, through a key that can only run the deploy script.
- nginx and pm2 on my VPS.
-
Passkeys and single sign-on
Passkey login and single sign-on: one identity service for every app, with WebAuthn, OIDC and roles that match how the organisation works.
Tell me what you need
A few lines about the project is enough. I read every message myself. I meet people face to face within about 30 miles of Portsmouth, and work with organisations anywhere in the UK.
Or email hello@passionfruit.design, or call or WhatsApp 07385 509278.