Skip to content

Commit 5696f34

Browse files
committed
marketing page added
1 parent 281479f commit 5696f34

File tree

6 files changed

+321
-0
lines changed

6 files changed

+321
-0
lines changed

compose.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,33 @@ services:
165165

166166
# Enable redirection for HTTP and HTTPS
167167
- traefik.http.routers.${STACK_NAME?Variable not set}-frontend-http.middlewares=https-redirect
168+
169+
marketing:
170+
image: 'marketing:${TAG-latest}'
171+
restart: always
172+
networks:
173+
- traefik-public
174+
- default
175+
build:
176+
context: .
177+
dockerfile: marketing/Dockerfile
178+
labels:
179+
- traefik.enable=true
180+
- traefik.docker.network=traefik-public
181+
- traefik.constraint-label=traefik-public
182+
183+
- traefik.http.services.${STACK_NAME?Variable not set}-marketing.loadbalancer.server.port=80
184+
185+
- traefik.http.routers.${STACK_NAME?Variable not set}-marketing-http.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`)
186+
- traefik.http.routers.${STACK_NAME?Variable not set}-marketing-http.entrypoints=http
187+
188+
- traefik.http.routers.${STACK_NAME?Variable not set}-marketing-https.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`)
189+
- traefik.http.routers.${STACK_NAME?Variable not set}-marketing-https.entrypoints=https
190+
- traefik.http.routers.${STACK_NAME?Variable not set}-marketing-https.tls=true
191+
- traefik.http.routers.${STACK_NAME?Variable not set}-marketing-https.tls.certresolver=le
192+
193+
# Enable redirection for HTTP and HTTPS
194+
- traefik.http.routers.${STACK_NAME?Variable not set}-marketing-http.middlewares=https-redirect
168195
volumes:
169196
app-db-data:
170197

marketing/Dockerfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
FROM nginx:1
2+
3+
COPY marketing/nginx.conf /etc/nginx/conf.d/default.conf
4+
COPY marketing/index.html /usr/share/nginx/html/index.html
5+
COPY marketing/robots.txt /usr/share/nginx/html/robots.txt
6+
COPY marketing/sitemap.xml /usr/share/nginx/html/sitemap.xml

marketing/index.html

Lines changed: 257 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>AITemplates - AI Templates for Proposals, Emails, and Outreach</title>
7+
<meta
8+
name="description"
9+
content="AITemplates helps you generate high-quality proposal and outreach drafts from your context. Build faster, keep consistency, and export polished content."
10+
/>
11+
<link rel="canonical" href="https://aitemplates.fr/" />
12+
<meta property="og:type" content="website" />
13+
<meta property="og:title" content="AITemplates" />
14+
<meta
15+
property="og:description"
16+
content="AI-powered template workflows for sales, freelance, and business communication."
17+
/>
18+
<meta property="og:url" content="https://aitemplates.fr/" />
19+
<meta property="og:site_name" content="AITemplates" />
20+
<meta name="twitter:card" content="summary_large_image" />
21+
<meta name="twitter:title" content="AITemplates" />
22+
<meta
23+
name="twitter:description"
24+
content="Create better proposals and outreach drafts with AI-powered templates."
25+
/>
26+
<script type="application/ld+json">
27+
{
28+
"@context": "https://schema.org",
29+
"@type": "SoftwareApplication",
30+
"name": "AITemplates",
31+
"applicationCategory": "BusinessApplication",
32+
"operatingSystem": "Web",
33+
"url": "https://aitemplates.fr/",
34+
"offers": {
35+
"@type": "Offer",
36+
"price": "0",
37+
"priceCurrency": "EUR"
38+
}
39+
}
40+
</script>
41+
<style>
42+
:root {
43+
--bg: #f5f3ec;
44+
--surface: #ffffff;
45+
--ink: #111827;
46+
--muted: #5a6475;
47+
--brand: #2563eb;
48+
--brand-strong: #1d4ed8;
49+
--line: #d8deea;
50+
}
51+
52+
* {
53+
box-sizing: border-box;
54+
}
55+
56+
body {
57+
margin: 0;
58+
color: var(--ink);
59+
background:
60+
radial-gradient(80rem 30rem at 20% -10%, #dbeafe 0%, transparent 60%),
61+
radial-gradient(60rem 20rem at 90% 0%, #fde68a 0%, transparent 55%),
62+
var(--bg);
63+
font-family: "Trebuchet MS", "Segoe UI", system-ui, sans-serif;
64+
}
65+
66+
.wrap {
67+
max-width: 1120px;
68+
margin: 0 auto;
69+
padding: 1.25rem;
70+
}
71+
72+
header {
73+
display: flex;
74+
align-items: center;
75+
justify-content: space-between;
76+
gap: 1rem;
77+
}
78+
79+
.logo {
80+
font-weight: 800;
81+
font-size: 1.1rem;
82+
letter-spacing: 0.02em;
83+
}
84+
85+
.btn {
86+
border: 1px solid var(--line);
87+
background: var(--surface);
88+
color: var(--ink);
89+
text-decoration: none;
90+
padding: 0.6rem 0.9rem;
91+
border-radius: 0.6rem;
92+
display: inline-flex;
93+
align-items: center;
94+
gap: 0.4rem;
95+
font-weight: 600;
96+
}
97+
98+
.btn.primary {
99+
border-color: var(--brand);
100+
background: var(--brand);
101+
color: #fff;
102+
}
103+
104+
.btn.primary:hover {
105+
background: var(--brand-strong);
106+
}
107+
108+
.hero {
109+
margin-top: 2.5rem;
110+
display: grid;
111+
gap: 1.25rem;
112+
}
113+
114+
h1 {
115+
margin: 0;
116+
font-size: clamp(2rem, 4vw, 3.2rem);
117+
line-height: 1.1;
118+
}
119+
120+
.lead {
121+
margin: 0;
122+
color: var(--muted);
123+
font-size: 1.05rem;
124+
max-width: 48rem;
125+
}
126+
127+
.hero-cta {
128+
display: flex;
129+
flex-wrap: wrap;
130+
gap: 0.7rem;
131+
}
132+
133+
.grid {
134+
margin-top: 2rem;
135+
display: grid;
136+
grid-template-columns: repeat(3, minmax(0, 1fr));
137+
gap: 0.9rem;
138+
}
139+
140+
.card {
141+
background: var(--surface);
142+
border: 1px solid var(--line);
143+
border-radius: 0.9rem;
144+
padding: 1rem;
145+
}
146+
147+
.card h3 {
148+
margin: 0 0 0.45rem 0;
149+
font-size: 1rem;
150+
}
151+
152+
.card p {
153+
margin: 0;
154+
color: var(--muted);
155+
font-size: 0.95rem;
156+
line-height: 1.45;
157+
}
158+
159+
.demo {
160+
margin-top: 2rem;
161+
}
162+
163+
.demo-box {
164+
background: #0f172a;
165+
color: #e5e7eb;
166+
border-radius: 0.9rem;
167+
border: 1px solid #1e293b;
168+
padding: 1rem;
169+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
170+
white-space: pre-wrap;
171+
line-height: 1.5;
172+
}
173+
174+
footer {
175+
margin-top: 2rem;
176+
padding-top: 1rem;
177+
border-top: 1px solid var(--line);
178+
color: var(--muted);
179+
font-size: 0.88rem;
180+
}
181+
182+
@media (max-width: 900px) {
183+
.grid {
184+
grid-template-columns: 1fr;
185+
}
186+
}
187+
</style>
188+
</head>
189+
<body>
190+
<div class="wrap">
191+
<header>
192+
<div class="logo">AITemplates</div>
193+
<a class="btn" href="https://dashboard.aitemplates.fr/login">Login</a>
194+
</header>
195+
196+
<main>
197+
<section class="hero">
198+
<h1>Generate high-converting proposals and outreach drafts in minutes</h1>
199+
<p class="lead">
200+
AITemplates turns your context into ready-to-send content. Keep your tone
201+
consistent, reduce repetitive writing, and ship better communication faster.
202+
</p>
203+
<div class="hero-cta">
204+
<a class="btn primary" href="https://dashboard.aitemplates.fr/login"
205+
>Try the Demo</a
206+
>
207+
<a class="btn" href="https://api.aitemplates.fr/docs">API Docs</a>
208+
</div>
209+
</section>
210+
211+
<section class="grid">
212+
<article class="card">
213+
<h3>Template-Driven</h3>
214+
<p>
215+
Define structured templates once, then reuse them across business cases.
216+
</p>
217+
</article>
218+
<article class="card">
219+
<h3>Smart Variable Extraction</h3>
220+
<p>
221+
Paste requirement text and let the system extract missing information
222+
automatically.
223+
</p>
224+
</article>
225+
<article class="card">
226+
<h3>Editable Output + Versioning</h3>
227+
<p>
228+
Fine-tune generated text, save versions, and build a repeatable content
229+
system.
230+
</p>
231+
</article>
232+
</section>
233+
234+
<section class="demo">
235+
<h2>Quick Example</h2>
236+
<div class="demo-box">
237+
Input:
238+
"Freelance product designer, B2B SaaS, need outreach email for founders"
239+
240+
Output:
241+
"Hi [Founder Name],
242+
I help B2B SaaS teams improve conversion with UX-led product design...
243+
Would you be open to a quick call this week?"
244+
</div>
245+
</section>
246+
</main>
247+
248+
<footer>
249+
<span id="year"></span> AITemplates. Built for practical teams shipping real
250+
work.
251+
</footer>
252+
</div>
253+
<script>
254+
document.getElementById("year").textContent = new Date().getFullYear()
255+
</script>
256+
</body>
257+
</html>

marketing/nginx.conf

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
server {
2+
listen 80;
3+
server_name _;
4+
root /usr/share/nginx/html;
5+
index index.html;
6+
7+
location = /robots.txt {
8+
add_header Cache-Control "public, max-age=3600";
9+
}
10+
11+
location = /sitemap.xml {
12+
add_header Cache-Control "public, max-age=3600";
13+
}
14+
15+
location / {
16+
try_files $uri $uri/ /index.html;
17+
}
18+
}

marketing/robots.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
User-agent: *
2+
Allow: /
3+
4+
Sitemap: https://aitemplates.fr/sitemap.xml

marketing/sitemap.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3+
<url>
4+
<loc>https://aitemplates.fr/</loc>
5+
</url>
6+
<url>
7+
<loc>https://dashboard.aitemplates.fr/login</loc>
8+
</url>
9+
</urlset>

0 commit comments

Comments
 (0)