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
1 change: 1 addition & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jobs:
- name: Build landing Docker image
run: |
docker build --build-arg NEXT_PUBLIC_APP_URL=${{ secrets.NEXT_PUBLIC_APP_URL }} \
--build-arg NEXT_PUBLIC_GA_ID=G-N8FTR16C4L \
-t markmdev/lingput-landing:${{ github.sha }} \
-t markmdev/lingput-landing \
./apps/landing
Expand Down
Binary file added apps/frontend/public/apple-touch-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/frontend/public/favicon-96x96.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/frontend/public/favicon.ico
Binary file not shown.
1 change: 1 addition & 0 deletions apps/frontend/public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions apps/frontend/public/site.webmanifest
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "Lingput",
"short_name": "Lingput",
"icons": [
{
"src": "/web-app-manifest-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/web-app-manifest-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/frontend/public/web-app-manifest-512x512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions apps/frontend/src/app/(unprotected)/login/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,17 @@ export default function LoginPage() {
Sign up
</Link>
</p>
<p className="text-xs text-slate-500 text-center mt-3">
By logging in, you agree to our{" "}
<Link href="/terms" className="underline hover:text-indigo-600">
Terms of Service
</Link>{" "}
and{" "}
<Link href="/privacy" className="underline hover:text-indigo-600">
Privacy Policy
</Link>
.
</p>
<p className="text-rose-600 text-sm text-center">{error?.message}</p>
</div>
</form>
Expand Down
13 changes: 13 additions & 0 deletions apps/frontend/src/app/(unprotected)/signup/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,19 @@ export default function SignupPage() {
Log in
</Link>
</p>

<p className="text-xs text-slate-500 text-center mt-3">
By signing up, you agree to our{" "}
<Link href="/terms" className="underline hover:text-indigo-600">
Terms of Service
</Link>{" "}
and{" "}
<Link href="/privacy" className="underline hover:text-indigo-600">
Privacy Policy
</Link>
.
</p>

<p className="text-rose-600 text-sm text-center">{error?.message}</p>
</div>
</form>
Expand Down
63 changes: 63 additions & 0 deletions apps/frontend/src/app/cookie/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import ReactMarkdown from "react-markdown";

export default function TermsPage() {
const content = `
# Cookie Policy — Lingput

**Effective date:** September 4, 2025
**Service:** Lingput (AI-powered language learning platform)

---

## 1. What Are Cookies?

Cookies are small text files stored on your device when you visit a website. They help websites remember your preferences and improve your browsing experience. Some cookies are essential, while others are optional.

---

## 2. How Lingput Uses Cookies

We use cookies in the following categories:

* **Essential cookies (required)**
Needed for core functionality such as login sessions, account security, and remembering your language progress.
These cannot be disabled.

* **Analytics cookies (optional)**
With your consent, we use Google Analytics 4 (Consent Mode) to understand how users interact with Lingput and to improve the platform. These cookies are only activated if you click **Accept** in the cookie banner.

* **No advertising cookies**
Lingput does not use advertising, remarketing, or personalization cookies.

---

## 3. Managing Your Cookie Preferences

* When you first visit Lingput, you can accept or reject analytics cookies via the cookie banner.
* You can change your choice at any time by clicking **Cookie Settings** in the footer.
* You can also delete cookies through your browser settings.

---

## 4. Third-Party Cookies

Some cookies may be placed by trusted third parties:

* **Google Analytics (Google LLC, USA)** — analytics cookies (only with your consent).

---

## 5. More Information

For details on how we handle personal data, see our [Privacy Policy](/privacy).

If you have questions about this Cookie Policy, contact us at **support@lingput.dev**.

`;

return (
<div>
<ReactMarkdown>{content}</ReactMarkdown>
</div>
);
}
55 changes: 55 additions & 0 deletions apps/frontend/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,63 @@ import { ToastContainer } from "react-toastify";
import "react-loading-skeleton/dist/skeleton.css";
import "./globals.css";
import { Inter } from "next/font/google";
import { Metadata } from "next";
import CookieBanner from "@/components/CookieBanner";

const inter = Inter({ subsets: ["latin"], display: "swap" });

export const metadata: Metadata = {
metadataBase: new URL("https://lingput.dev"),
title: "Lingput - Learn German with AI-Generated Stories",
description:
"Learn German with short, AI-generated stories tailored to your vocabulary level. Natural comprehensible input for English speakers with translations, audio, and smart word tracking.",
keywords: [
"learn german",
"language learning",
"comprehensible input",
"AI stories",
"german for english speakers",
"vocabulary builder",
],
openGraph: {
title: "Lingput - Learn German with AI-Generated Stories",
description:
"Learn German with short, AI-generated stories tailored to your vocabulary level for English speakers.",
url: "https://lingput.dev",
siteName: "Lingput",
images: [
{
url: "/logo_min.png",
width: 1024,
height: 366,
alt: "Lingput Logo",
},
],
locale: "en_US",
type: "website",
},
twitter: {
card: "summary_large_image",
title: "Lingput - Learn German with AI-Generated Stories",
description: "Learn German with AI-generated stories tailored to your vocabulary level.",
images: ["/logo_min.png"],
},
icons: {
icon: [
{ url: "/favicon.ico", sizes: "any" },
{ url: "/favicon.svg", type: "image/svg+xml" },
],
apple: [{ url: "/apple-touch-icon.png" }],
},
manifest: "/site.webmanifest",
authors: [{ name: "Mark Morgan", url: "https://markmdev.com" }],
robots: {
index: true,
follow: true,
nocache: false,
},
};

export default function RootLayout({
children,
}: Readonly<{
Expand All @@ -17,6 +71,7 @@ export default function RootLayout({
>
{children}
<ToastContainer />
<CookieBanner />
</body>
</html>
);
Expand Down
125 changes: 125 additions & 0 deletions apps/frontend/src/app/privacy/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import ReactMarkdown from "react-markdown";

export default function PrivacyPage() {
const content = `
# Privacy Policy — Lingput

**Effective date:** September 4, 2025
**Service:** Lingput (AI-powered language learning platform)

---

## 1. Introduction

Lingput is an AI-powered language learning application. This Privacy Policy explains how we collect, use, and protect your personal data when you use Lingput.

---

## 2. What Data We Collect

* **Account information**: email address, username, password (hashed).
* **Learning progress**: words, stories, and exercises you complete, your vocabulary history, and session stats.
* **Generated content**: stories, translations, and audio files generated for you by our AI.
* **Technical data**: browser type, IP address, device information, cookies (only with your consent).
* **Payment data**: if applicable, processed securely by third-party payment providers (we do not store your card details).

---

## 3. How We Use Your Data

* To provide the Lingput service (saving your learning history, generating personalized exercises).
* To improve the platform (analytics, performance monitoring, bug fixing).
* To ensure security (account authentication, fraud prevention).
* To comply with legal obligations (tax, accounting, regulatory compliance).

We do **not** sell your personal information.

---

## 4. AI-Generated Content

Lingput uses third-party AI services (e.g., OpenAI APIs) to generate stories, translations, and audio.

* Your input text may be transmitted to these services to generate the output.
* Data is not used by these providers to train their models (per their policies at the time of writing).
* We only store the outputs relevant to your learning history.

---

## 5. Cookies and Tracking

Lingput uses cookies only with your consent:

* **Functional cookies**: required for login and session security.
* **Analytics cookies**: optional, used to understand usage patterns (Google Analytics 4 with Consent Mode).
* **No advertising cookies** are used.

You can change your cookie preferences anytime via the “Cookie Settings” link.

---

## 6. Data Sharing

We share data only with trusted providers necessary to operate Lingput:

* **Hosting & infrastructure**: DigitalOcean, AWS, Supabase, Redis.
* **Analytics**: Google Analytics (if you consent).
* **AI processing**: OpenAI API for text and audio generation.
* **Payments**: Stripe or other payment processors (if you purchase a subscription).

---

## 7. Data Retention

* Account data is stored until you delete your account.
* Learning history persists while your account is active.
* Analytics data (if enabled) is retained per provider defaults (up to 14 months).
* Server logs are rotated every 30–90 days.

---

## 8. Your Rights

Depending on your jurisdiction (EU/EEA, UK, California), you may have the right to:

* Access, correct, or delete your personal data.
* Request export of your data (data portability).
* Withdraw consent for analytics cookies.
* Delete your account at any time.

To exercise these rights, contact us at **support@lingput.dev**.

---

## 9. Security

We use HTTPS, hashed passwords, access controls, and monitoring to protect your data.
However, no online service is 100% secure — please use a strong password and keep it private.

---

## 10. Children’s Privacy

Lingput is not directed to children under 13 (or the age of digital consent in your region).
We do not knowingly collect personal information from children.

---

## 11. Changes

We may update this Privacy Policy occasionally. Updates will be posted here with a new “Effective date.”

---

## 12. Contact

For questions, requests, or concerns:
Email: **[support@lingput.dev](mailto:support@lingput.dev)**
`;

return (
<div>
<ReactMarkdown>{content}</ReactMarkdown>
</div>
);
}
Loading