1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/><title>Sign up â Waterwheel Village</title><meta name="theme-color" content="#c2410c"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-status-bar-style" content="default"/><meta name="apple-mobile-web-app-title" content="Village"/><meta name="mobile-web-app-capable" content="yes"/><meta name="author" content="Waterwheel Village"/><meta name="google-site-verification" content="xRE-_XOrfmKkJKbF0zRqNe7tze5i68S8d_v5VzUtnkQ"/><meta property="og:title" content="Waterwheel Village â Learn English with kind neighbours"/><meta property="og:description" content="A cozy storybook village where Finnish learners practice English with ten warm characters."/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary"/><meta name="twitter:site" content="@Lovable"/><meta name="twitter:title" content="Waterwheel Village â Learn English with kind neighbours"/><meta name="twitter:description" content="A cozy storybook village where Finnish learners practice English with ten warm characters."/><meta property="og:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/7741823c-2957-4413-a4ca-ec52c4ffdb17/id-preview-3ea469df--c310719e-3d36-46ca-926b-934d24bd5e8f.lovable.app-1777484083514.png"/><meta name="twitter:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/7741823c-2957-4413-a4ca-ec52c4ffdb17/id-preview-3ea469df--c310719e-3d36-46ca-926b-934d24bd5e8f.lovable.app-1777484083514.png"/><meta name="description" content="Create your free Waterwheel Village account and join a cozy English-learning village."/><link rel="modulepreload" href="/assets/main-DUKblHcf.js"/><link rel="modulepreload" href="/assets/signup-ucY1cOLX.js"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="manifest" href="/manifest.webmanifest"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="192x192" href="/app-icon-192.png"/><link rel="icon" type="image/png" sizes="512x512" href="/app-icon-512.png"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,[email protected],500;9..144,600;9..144,700;9..144,800&family=Nunito:wght@400;500;600;700&display=swap"/><link rel="stylesheet" href="/assets/styles-D8MHfHZI.css"/>
1<script defer src="/~flock.js" data-proxy-url="/~api/analytics"></script>
1</head><body><!--$--><div class="min-h-screen bg-background"><div class="mx-auto max-w-md px-6 py-12"><a href="/" class="text-sm text-muted-foreground hover:text-foreground">â Back to the village</a><h1 class="mt-6 font-display text-3xl font-700 text-foreground">Join the village</h1><p class="mt-2 text-muted-foreground">A few small details help your villagers greet you properly.</p><button type="button" class="mt-6 inline-flex w-full items-center justify-center gap-3 rounded-full border border-border bg-card px-5 py-3 text-sm font-semibold text-foreground transition-colors hover:bg-accent/40"><svg width="18" height="18" viewBox="0 0 24 24" aria-hidden="true"><path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"></path><path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.99.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"></path><path fill="#FBBC05" d="M5.84 14.1c-.22-.66-.35-1.36-.35-2.1s.13-1.44.35-2.1V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l3.66-2.84z"></path><path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84C6.71 7.31 9.14 5.38 12 5.38z"></path></svg>Continue with Google</button><div class="my-6 flex items-center gap-3 text-xs uppercase tracking-wider text-muted-foreground"><div class="h-px flex-1 bg-border"></div>or with email<div class="h-px flex-1 bg-border"></div></div><form class="space-y-4"><div><label class="block text-sm font-medium text-foreground">Your name</label><input type="text" required="" maxLength="60" class="mt-1 w-full rounded-xl border border-input bg-background px-4 py-2.5 text-base text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" placeholder="What should we call you?" value=""/></div><div><label class="block text-sm font-medium text-foreground">Email</label><input type="email" required="" autoComplete="email" class="mt-1 w-full rounded-xl border border-input bg-background px-4 py-2.5 text-base text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" value=""/></div><div><label class="block text-sm font-medium text-foreground">Password</label><input type="password" required="" minLength="8" autoComplete="new-password" class="mt-1 w-full rounded-xl border border-input bg-background px-4 py-2.5 text-base text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" value=""/><p class="mt-1 text-xs text-muted-foreground">At least 8 characters.</p></div><div class="grid gap-4 sm:grid-cols-2"><div><label class="block text-sm font-medium text-foreground">Native language</label><select class="mt-1 w-full rounded-xl border border-input bg-background px-3 py-2.5 text-base text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"><option value="" selected="">â</option><option value="Finnish">Finnish</option><option value="Swedish">Swedish</option><option value="Russian">Russian</option><option value="Estonian">Estonian</option><option value="Arabic">Arabic</option><option value="Ukrainian">Ukrainian</option><option value="Spanish">Spanish</option><option value="French">French</option><option value="German">German</option><option value="Other">Other</option></select></div><div><label class="block text-sm font-medium text-foreground">English level</label><select class="mt-1 w-full rounded-xl border border-input bg-background px-3 py-2.5 text-base text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"><option value="" selected="">â</option><option value="Just starting">Just starting</option><option value="A few words">A few words</option><option value="Beginner">Beginner</option><option value="Intermediate">Intermediate</option><option value="Advanced">Advanced</option></select></div></div><div><label class="block text-sm font-medium text-foreground">Why are you learning?</label><select class="mt-1 w-full rounded-xl border border-input bg-background px-3 py-2.5 text-base text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"><option value="" selected="">â</option><option value="For everyday life">For everyday life</option><option value="For work">For work</option><option value="For travel">For travel</option><option value="For family">For family</option><option value="Just for fun">Just for fun</option></select></div><label class="flex items-start gap-2 text-sm text-foreground">
1<input type="checkbox" class="mt-1 h-4 w-4 rounded border-input" checked=""/><span>Send me gentle updates from the village (new chapters, tips, milestones). You can unsubscribe anytime.</span></label><button type="submit" class="w-full rounded-full bg-primary px-5 py-3 font-semibold text-primary-foreground transition-transform hover:-translate-y-0.5 disabled:opacity-60 disabled:hover:translate-y-0">Create my account â</button></form><p class="mt-6 text-center text-sm text-muted-foreground">Already have an account?<!-- --> <a href="/login" class="font-semibold text-primary hover:underline">Sign in</a></p></div></div>
1<script>(function(t){let s;try{s=JSON.parse(sessionStorage.getItem(t.storageKey)||"{}")}catch(e){console.error(e);return}const c=t.key||window.history.state?.__TSR_key,r=c?s[c]:void 0;if(t.shouldScrollRestoration&&r&&typeof r=="object"&&Object.keys(r).length>0){for(const e in r){const o=r[e];if(!o||typeof o!="object")continue;const l=o.scrollX,i=o.scrollY;if(!(!Number.isFinite(l)||!Number.isFinite(i))){if(e==="window")window.scrollTo({top:i,left:l,behavior:t.behavior});else if(e){let n;try{n=document.querySelector(e)}catch{continue}n&&(n.scrollLeft=l,n.scrollTop=i)}}}return}const a=window.location.hash.split("#",2)[1];if(a){const e=window.history.state?.__hashScrollIntoViewOptions??!0;if(e){const o=document.getElementById(a);o&&o.scrollIntoView(e)}return}window.scrollTo({top:0,left:0,behavior:t.behavior})})({"storageKey":"tsr-scroll-restoration-v1_3","shouldScrollRestoration":true});document.currentScript.remove()</script>
1<!--/$--><footer class="border-t border-border/60 bg-background/80 mt-16"><div class="mx-auto max-w-5xl px-6 py-8 text-center text-xs text-muted-foreground"><p class="mb-3">© <!-- -->2026<!-- --> The Hakso English School Oy. All rights reserved.</p><nav class="flex flex-wrap items-center justify-center gap-x-4 gap-y-2"><a href="/terms" class="hover:text-foreground hover:underline">Terms & Conditions</a><span aria-hidden="true">·</span><a href="/refunds" class="hover:text-foreground hover:underline">Refund Policy</a><span aria-hidden="true">·</span><a href="/privacy" class="hover:text-foreground hover:underline">Privacy Notice</a></nav><p class="mt-3">Payments are securely processed by Paddle.com Market Ltd, our reseller and Merchant of Record.</p></div></footer><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section>
1<script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/main-DUKblHcf.js"],assets:$R[5]=[$R[6]={tag:"script",attrs:$R[7]={type:"module",async:!0},children:"import(\"/assets/main-DUKblHcf.js\")"}]},"/signup":$R[8]={preloads:$R[9]=["/assets/signup-ucY1cOLX.js"]}}},matches:$R[10]=[$R[11]={i:"__root__�",u:1790998832739,s:"success",ssr:!0},$R[12]={i:"�signup�signup",u:1790998832739,s:"success",ssr:!0}],lastMatchId:"�signup�signup"})($R["tsr"]);$_TSR.e();document.currentScript.remove()</script>
1<script type="module" async="">import("/assets/main-DUKblHcf.js")</script>
1</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.