Okay, let's craft a landing page for `agentable` that's not just informative and high-quality, but truly *pops* with a sleek, content-focused "Netflix aesthetic." We'll focus on dynamic visuals, rich typography, and a narrative flow that draws the user in, making them want to explore this powerful tool. --- ## Agentable Landing Page: "Orchestrate Smarter LLM Agents" **Design Language: "The Algorithm's Edge"** * **Overall Vibe:** Dark, sophisticated, futuristic. Think Netflix's UI – deep backgrounds, vibrant, carefully placed accent colors, sharp text, and a focus on compelling content. * **Color Palette:** * **Primary Background:** `#0A0A0E` (Deep Charcoal Black) * **Secondary Backgrounds/Cards:** `#15151A` (Slightly lighter charcoal) * **Accent 1 (Primary Highlight):** `#E50914` (Netflix Red, used sparingly for CTAs, key accents) * **Accent 2 (Secondary Highlight/Glow):** `#00F0FF` (Electric Cyan – for subtle glowing elements, data streams, code highlights) * **Accent 3 (Tertiary Glow):** `#8A2BE2` (Amethyst Purple – for background gradients, ethereal effects) * **Text:** `#F0F0F0` (Off-white for readability), `#B0B0B0` (Lighter gray for secondary text). * **Typography:** * **Headings (H1, H2):** Montserrat (Bold, Ultra-Bold) - Modern, strong, impactful. * **Body Text:** Lato (Regular, Light) - Clean, highly readable. * **Code Blocks:** Roboto Mono - Monospaced, clear for code. * **Imagery & Visuals:** * Abstract, glowing neural network patterns. * Dynamic data streams flowing in the background. * Subtle animations: parallax scrolling, hover effects, subtle glows. * Clean, minimalist iconography where appropriate. * Focus on illustrative representations of "memory," "state," and "connections." --- ### **Section 1: Hero - The Grand Reveal** **(Visual: Full-width, dynamic background. Imagine a dark, cosmic-like canvas. Subtle, electric blue and amethyst purple light trails streak across the background, resembling data flow or neural pathways. In the foreground, the Agentable logo subtly glows.)** ---
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Agentable: Orchestrate Smarter LLM Agents</title>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@700;800;900&family=Lato:wght@300;400&family=Roboto+Mono&display=swap" rel="stylesheet">
<style>
:root {
--bg-primary: #0A0A0E;
--bg-secondary: #15151A;
--accent-red: #E50914;
--accent-cyan: #00F0FF;
--accent-purple: #8A2BE2;
--text-light: #F0F0F0;
--text-subtle: #B0B0B0;
--code-bg: #1A1A1E;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Lato', sans-serif;
color: var(--text-light);
background-color: var(--bg-primary);
line-height: 1.6;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Montserrat', sans-serif;
font-weight: 800;
color: var(--text-light);
}
a {
color: var(--accent-cyan);
text-decoration: none;
transition: color 0.3s ease;
}
a:hover {
color: var(--accent-red);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 40px 20px;
}
/* --- Hero Section --- */
.hero {
position: relative;
height: 90vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
overflow: hidden;
background: linear-gradient(135deg, var(--bg-primary) 0%, #000000 100%);
border-bottom: 2px solid var(--accent-purple);
}
.hero-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: radial-gradient(circle at center, rgba(0,240,255,0.1) 0%, transparent 50%),
url('data:image/svg+xml;utf8,');
background-size: cover, 100% 100%;
opacity: 0.7;
animation: pulse-glow 8s infinite alternate;
}
@keyframes pulse-glow {
from { opacity: 0.7; transform: scale(1); }
to { opacity: 0.9; transform: scale(1.03); }
}
.hero-content {
position: relative;
z-index: 10;
max-width: 900px;
padding: 20px;
}
.hero h1 {
font-size: 4.5em; /* 72px */
margin-bottom: 20px;
letter-spacing: -2px;
line-height: 1.1;
background: linear-gradient(45deg, var(--accent-cyan), var(--accent-purple));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: 0 0 15px rgba(0,240,255,0.4), 0 0 30px rgba(138,43,226,0.3);
animation: text-glow 2s infinite alternate;
}
@keyframes text-glow {
from { text-shadow: 0 0 10px rgba(0,240,255,0.3), 0 0 20px rgba(138,43,226,0.2); }
to { text-shadow: 0 0 15px rgba(0,240,255,0.5), 0 0 30px rgba(138,43,226,0.4); }
}
.hero p {
font-size: 1.6em; /* 26px */
margin-bottom: 40px;
color: var(--text-subtle);
font-weight: 300;
}
.hero-cta-group {
display: flex;
gap: 20px;
justify-content: center;
flex-wrap: wrap;
}
.btn {
padding: 18px 36px;
border-radius: 8px;
font-family: 'Montserrat', sans-serif;
font-weight: 700;
font-size: 1.1em;
text-transform: uppercase;
letter-spacing: 1px;
transition: all 0.3s ease;
cursor: pointer;
border: none;
}
.btn-primary {
background-color: var(--accent-red);
color: var(--text-light);
box-shadow: 0 5px 20px rgba(229,9,20,0.4);
animation: pulse-btn 1.5s infinite alternate;
}
.btn-primary:hover {
background-color: #FF1A23;
transform: translateY(-3px) scale(1.02);
box-shadow: 0 8px 25px rgba(229,9,20,0.6);
}
@keyframes pulse-btn {
from { transform: scale(1); box-shadow: 0 5px 20px rgba(229,9,20,0.4); }
to { transform: scale(1.02); box-shadow: 0 8px 25px rgba(229,9,20,0.6); }
}
.btn-secondary {
background-color: transparent;
color: var(--accent-cyan);
border: 2px solid var(--accent-cyan);
box-shadow: 0 0 15px rgba(0,240,255,0.3);
}
.btn-secondary:hover {
background-color: rgba(0,240,255,0.1);
border-color: var(--accent-cyan);
color: var(--accent-cyan);
transform: translateY(-3px) scale(1.02);
box-shadow: 0 0 20px rgba(0,240,255,0.5);
}
/* Scroll indicator */
.scroll-indicator {
position: absolute;
bottom: 30px;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
font-size: 0.9em;
color: var(--text-subtle);
opacity: 0.7;
animation: bounce-arrow 2s infinite;
}
.scroll-indicator svg {
margin-top: 10px;
width: 24px;
height: 24px;
fill: var(--accent-cyan);
}
@keyframes bounce-arrow {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-10px);
}
60% {
transform: translateY(-5px);
}
}
/* --- Global Section Styling --- */
section {
padding: 80px 0;
position: relative;
z-index: 1; /* Ensure content is above background effects */
}
section:nth-of-type(odd) {
background-color: var(--bg-secondary);
border-top: 1px solid rgba(138,43,226,0.2);
border-bottom: 1px solid rgba(0,240,255,0.2);
}
section h2 {
font-size: 3.2em; /* 50px */
text-align: center;
margin-bottom: 60px;
letter-spacing: -1px;
background: linear-gradient(90deg, var(--accent-purple), var(--accent-cyan));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: 0 0 10px rgba(138,43,226,0.2);
}
section p {
font-size: 1.15em; /* 18px */
margin-bottom: 20px;
max-width: 800px;
margin-left: auto;
margin-right: auto;
color: var(--text-subtle);
}
/* Specific section styling */
.problem-solution .content-grid {
display: flex;
gap: 40px;
justify-content: center;
align-items: flex-start;
flex-wrap: wrap;
}
.problem-solution .card {
background-color: var(--bg-primary);
border: 1px solid rgba(0,240,255,0.1);
border-radius: 12px;
padding: 30px;
flex: 1;
min-width: 300px;
max-width: 45%;
box-shadow: 0 0 30px rgba(0,240,255,0.1);
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.problem-solution .card:hover {
transform: translateY(-5px);
box-shadow: 0 0 40px rgba(0,240,255,0.2);
}
.problem-solution .card h3 {
font-size: 1.8em;
margin-bottom: 20px;
color: var(--accent-cyan);
border-bottom: 2px solid rgba(0,240,255,0.3);
padding-bottom: 10px;
}
.problem-solution .card.solution h3 {
color: var(--accent-purple);
border-bottom: 2px solid rgba(138,43,226,0.3);
}
.problem-solution .card ul {
list-style: none;
padding-left: 0;
}
.problem-solution .card ul li {
position: relative;
padding-left: 25px;
margin-bottom: 10px;
font-size: 1.05em;
color: var(--text-subtle);
}
.problem-solution .card ul li::before {
content: '•';
position: absolute;
left: 0;
color: var(--accent-cyan);
font-size: 1.2em;
line-height: 1;
}
.problem-solution .card.solution ul li::before {
color: var(--accent-purple);
}
/* Key Features */
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 30px;
margin-top: 40px;
}
.feature-card {
background-color: var(--bg-primary);
border-radius: 12px;
padding: 30px;
text-align: center;
border: 1px solid rgba(138,43,226,0.1);
box-shadow: 0 0 25px rgba(138,43,226,0.15);
transition: transform 0.3s ease, box-shadow 0.3s ease;
position: relative;
overflow: hidden;
}
.feature-card::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle at center, rgba(138,43,226,0.1) 0%, transparent 70%);
opacity: 0;
transition: opacity 0.5s ease;
z-index: 0;
}
.feature-card:hover::before {
opacity: 1;
animation: rotate-glow 5s linear infinite;
}
@keyframes rotate-glow {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.feature-card:hover {
transform: translateY(-8px);
box-shadow: 0 0 35px rgba(138,43,226,0.3);
}
.feature-card .icon {
font-size: 3em;
color: var(--accent-cyan);
margin-bottom: 20px;
text-shadow: 0 0 10px rgba(0,240,255,0.5);
position: relative;
z-index: 1;
}
.feature-card h3 {
font-size: 1.6em;
margin-bottom: 15px;
color: var(--accent-red);
position: relative;
z-index: 1;
}
.feature-card p {
font-size: 1em;
color: var(--text-subtle);
position: relative;
z-index: 1;
}
/* Core Components */
.component-section {
padding: 80px 0;
text-align: center;
}
.component-section h2 {
margin-bottom: 30px;
}
.component-section > p {
margin-bottom: 60px;
}
.component-grid {
display: flex;
gap: 40px;
justify-content: center;
flex-wrap: wrap;
}
.component-card {
background: linear-gradient(145deg, var(--bg-primary) 0%, var(--bg-secondary) 100%);
border-radius: 15px;
padding: 40px;
flex: 1;
min-width: 350px;
max-width: 48%;
border: 1px solid rgba(0,240,255,0.1);
box-shadow: 0 5px 30px rgba(0,0,0,0.3);
transition: transform 0.3s ease, box-shadow 0.3s ease;
position: relative;
overflow: hidden;
text-align: left;
}
.component-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at top right, rgba(0,240,255,0.15) 0%, transparent 60%);
opacity: 0;
transition: opacity 0.5s ease;
}
.component-card:nth-of-type(2)::after {
background: radial-gradient(circle at bottom left, rgba(138,43,226,0.15) 0%, transparent 60%);
}
.component-card:hover {
transform: translateY(-10px);
box-shadow: 0 10px 40px rgba(0,0,0,0.5);
}
.component-card:hover::after {
opacity: 1;
}
.component-card h3 {
font-size: 2.2em;
margin-bottom: 20px;
background: linear-gradient(90deg, var(--accent-cyan), var(--text-light));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
position: relative;
z-index: 1;
}
.component-card:nth-of-type(2) h3 {
background: linear-gradient(90deg, var(--accent-purple), var(--text-light));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.component-card p {
font-size: 1.1em;
margin-bottom: 25px;
color: var(--text-subtle);
position: relative;
z-index: 1;
}
.component-card .code-block-inline {
background-color: var(--code-bg);
border-radius: 8px;
padding: 20px;
font-family: 'Roboto Mono', monospace;
font-size: 0.9em;
color: var(--accent-cyan);
border: 1px solid rgba(0,240,255,0.2);
position: relative;
z-index: 1;
white-space: pre-wrap; /* Allows line breaks in code */
word-break: break-all;
}
.component-card:nth-of-type(2) .code-block-inline {
color: var(--accent-purple);
border: 1px solid rgba(138,43,226,0.2);
}
/* Getting Started */
.get-started {
text-align: center;
}
.code-block {
background-color: var(--code-bg);
border-radius: 10px;
padding: 30px;
margin: 40px auto 60px auto;
max-width: 800px;
text-align: left;
overflow-x: auto;
border: 2px solid var(--accent-cyan);
box-shadow: 0 0 25px rgba(0,240,255,0.3);
position: relative;
}
.code-block code {
font-family: 'Roboto Mono', monospace;
font-size: 1em;
line-height: 1.6;
color: var(--text-light);
}
/* Syntax Highlighting - Faux */
.code-block .keyword { color: var(--accent-red); font-weight: bold; }
.code-block .function { color: var(--accent-cyan); }
.code-block .string { color: #A4F0B7; } /* Green */
.code-block .comment { color: #6A6A70; font-style: italic; }
.code-block .class { color: var(--accent-purple); font-weight: bold; }
.code-block .variable { color: var(--text-subtle); }
.code-block .number { color: #F0B7A4; } /* Orange */
.code-block .line-numbers {
opacity: 0.3;
user-select: none;
display: inline-block;
margin-right: 15px;
text-align: right;
border-right: 1px solid rgba(255,255,255,0.1);
padding-right: 15px;
color: var(--text-subtle);
font-size: 0.9em;
}
.code-block .code-lines {
display: inline-block;
vertical-align: top;
}
.code-block pre {
display: flex;
}
.code-block pre code {
flex-grow: 1;
}
/* Why Agentable */
.why-agentable .reason-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 30px;
margin-top: 40px;
}
.reason-card {
background-color: var(--bg-primary);
border-radius: 10px;
padding: 30px;
border: 1px solid rgba(138,43,226,0.1);
box-shadow: 0 0 20px rgba(138,43,226,0.1);
transition: all 0.3s ease;
text-align: center;
}
.reason-card:hover {
transform: translateY(-5px) scale(1.01);
box-shadow: 0 0 30px rgba(138,43,226,0.25);
border-color: var(--accent-purple);
}
.reason-card h3 {
font-size: 1.8em;
margin-bottom: 15px;
color: var(--accent-purple);
}
.reason-card p {
font-size: 1.05em;
color: var(--text-subtle);
}
/* Call to Action Final */
.cta-final {
background: linear-gradient(45deg, var(--accent-red), #FF4500); /* Orange-red gradient */
padding: 80px 0;
text-align: center;
border-top: 2px solid var(--accent-cyan);
}
.cta-final h2 {
color: var(--text-light);
text-shadow: 0 0 10px rgba(0,0,0,0.5);
-webkit-text-fill-color: var(--text-light); /* Override gradient for this specific h2 */
background: none;
}
.cta-final p {
font-size: 1.4em;
max-width: 700px;
margin: 0 auto 40px auto;
color: var(--text-light);
font-weight: 300;
}
/* Footer */
.footer {
background-color: #050508;
color: var(--text-subtle);
padding: 40px 0;
text-align: center;
font-size: 0.9em;
border-top: 1px solid rgba(0,240,255,0.1);
}
.footer a {
color: var(--accent-cyan);
margin: 0 15px;
}
.footer a:hover {
color: var(--accent-red);
}
.footer .social-icons {
margin-top: 20px;
}
.footer .social-icons img {
width: 28px;
height: 28px;
margin: 0 10px;
filter: grayscale(100%) brightness(1.5);
transition: filter 0.3s ease;
}
.footer .social-icons img:hover {
filter: grayscale(0%) brightness(1);
}
/* Responsive Adjustments */
@media (max-width: 1024px) {
.container {
padding: 30px 15px;
}
.hero h1 {
font-size: 3.5em;
}
.hero p {
font-size: 1.4em;
}
section h2 {
font-size: 2.8em;
margin-bottom: 40px;
}
.problem-solution .card {
max-width: 100%;
}
.component-card {
max-width: 100%;
}
}
@media (max-width: 768px) {
.hero {
height: 100vh;
}
.hero h1 {
font-size: 2.8em;
letter-spacing: -1px;
}
.hero p {
font-size: 1.2em;
}
.hero-cta-group {
flex-direction: column;
gap: 15px;
}
.btn {
width: 80%;
margin: 0 auto;
}
section {
padding: 60px 0;
}
section h2 {
font-size: 2.2em;
}
.problem-solution .content-grid, .component-grid, .features-grid, .why-agentable .reason-grid {
flex-direction: column;
}
.component-card, .feature-card, .reason-card, .problem-solution .card {
width: 100%;
}
.code-block {
padding: 20px;
}
}
@media (max-width: 480px) {
.hero h1 {
font-size: 2.2em;
}
.hero p {
font-size: 1em;
}
.btn {
width: 90%;
}
section h2 {
font-size: 1.8em;
}
.problem-solution .card h3, .feature-card h3, .component-card h3, .reason-card h3 {
font-size: 1.5em;
}
.component-card .code-block-inline {
font-size: 0.8em;
}
.code-block code {
font-size: 0.8em;
}
}
</style>
</head>
<body>
<!-- Hero Section -->
<section class="hero">
<div class="hero-background"></div>
<div class="hero-content">
<h1>AGENTABLE<br> Orchestrate Smarter LLM Agents.</h1>
<p>Unleash the full potential of your AI agents with seamless, persistent memory and state management. Built for resilience, designed for clarity.</p>
<div class="hero-cta-group">
<a href="https://github.com/mikehenken/agentable#getting-started" target="_blank" class="btn btn-primary">Get Started Instantly</a>
<a href="#explore-features" class="btn btn-secondary">Explore The Core</a>
</div>
</div>
<div class="scroll-indicator">
Scroll to Discover
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 21l-8-9h5V3h6v9h5l-8 9z"/></svg>
</div>
</section>
<!-- The Challenge & The Solution -->
<section class="problem-solution">
<div class="container">
<h2>The Forgetting Frontier: Why Agents Struggle</h2>
<p>Building truly intelligent and long-running LLM agents often hits a wall. Without robust memory and state management, agents are confined to short, stateless interactions, losing context and consistency.</p>
<div class="content-grid">
<div class="card problem">
<h3>The Pain Points</h3>
<ul>
<li><strong>Context Loss:</strong> Agents forget previous interactions, leading to repetitive or illogical responses.</li>
<li><strong>Stateless Operation:</strong> Every interaction is a new start, making complex, multi-turn conversations impossible.</li>
<li><strong>Scalability Nightmare:</strong> Manually managing agent data across sessions or users is prone to errors and bottlenecks.</li>
<li><strong>Developer Overhead:</strong> Re-implementing memory and state for every agent drains valuable development time.</li>
<li><strong>Reliability Concerns:</strong> System crashes or restarts mean lost progress and frustrated users.</li>
</ul>
</div<!--
--><div class="card solution">
<h3>Agentable: The Persistent Solution</h3>
<ul>
<li><strong>Infinite Memory:</strong> Agents remember everything, from specific messages to overall conversation flow.</li>
<li><strong>Dynamic State:</strong> Maintain and evolve internal variables, environment settings, and agent persona effortlessly.</li>
<li><strong>Built-in Persistence:</strong> Data is automatically saved and restored, ensuring continuity across sessions.</li>
<li><strong>Simplified Development:</9strong> Focus on agent logic, not boilerplate data management.</li>
<li><strong>Framework Agnostic:</strong> Designed to integrate smoothly with LangChain, LlamaIndex, or your custom LLM stack.</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Key Features -->
<section id="explore-features">
<div class="container">
<h2>Beyond Simple Chats: What Agentable Delivers</h2>
<p>Agentable isn't just about storing data; it's about empowering your agents with true awareness and the ability to operate across complex, multi-stage interactions.</p>
<div class="features-grid">
<div class="feature-card">
<div class="icon">🧠</div>
<h3>Intelligent Memory</h3>
<p>Structured storage for conversational history, scratchpad notes, and episodic memories. Agents learn and adapt over time.</p>
</div>
<div class="feature-card">
<div class="icon">⚙️</div>
<h3>Robust State Management</h3>
<p>Define and manage agent variables, environmental parameters, and internal flags. Keep your agents consistent and contextually aware.</p>
</div>
<div class="feature-card">
<div class="icon">💾</div>
<h3>Automatic Persistence</h3>
<p>Leverage SQLAlchemy for seamless database integration. All agent memory and state are automatically saved and restored.</p>
</div>
<div class="feature-card">
<div class="icon">✨</div>
<h3>Pythonic Simplicity</h3>
<p>A clean, intuitive API designed for Python developers. Integrate with just a few lines of code, focusing on agent logic.</p>
</div>
<div class="feature-card">
<div class="icon">🔗</div>
<h3>Framework Compatibility</h3>
<p>Designed with common LLM frameworks like LangChain in mind, Agentable is easily adaptable to your existing projects.</p>
</div>
<div class="feature-card">
<div class="icon">🔒</div>
<h3>Reliable & Scalable</h3>
<p>Built on proven technologies, Agentable provides a solid foundation for deploying production-grade, multi-user LLM applications.</p>
</div>
</div>
</div>
</section>
<!-- Core Components -->
<section class="component-section">
<div class="container">
<h2>Anatomy of an Intelligent Agent</h2>
<p>Agentable provides two core, highly flexible components that work in harmony to give your LLM agents true persistence and context.</p>
<div class="component-grid">
<div class="component-card">
<h3>The AgentMemory</h3>
<p>The ultimate recall system for your agents. <code>AgentMemory</code> stores every interaction, thought, and observation, allowing your agents to build rich, long-term context over countless sessions.</p>
<div class="code-block-inline">
<span class="keyword">from</span> agentable <span class="keyword">import</span> AgentMemory<br><br>
memory = <span class="class">AgentMemory</span>(agent_id=<span class="string">"user123"</span>)<br>
memory.add_message(<span class="string">"user"</span>, <span class="string">"Hello, who are you?"</span>)<br>
memory.add_scratchpad_note(<span class="string">"Planning response..."</span>)<br>
<span class="comment"># ... and it's all saved!</span>
</div>
</div><!--
--><div class="component-card">
<h3>The AgentState</h3>
<p>The agent's dynamic environment. <code>AgentState</code> holds all the critical variables, parameters, and environmental data that define an agent's current situation and capabilities, ensuring consistent behavior.</p>
<div class="code-block-inline">
<span class="keyword">from</span> agentable <span class="keyword">import</span> AgentState<br><br>
state = <span class="class">AgentState</span>(agent_id=<span class="string">"user123"</span>)<br>
state.set(<span class="string">"user_name"</span>, <span class="string">"Alice"</span>)<br>
state.set(<span class="string">"tool_access"</span>, <span class="keyword">True</span>)<br>
<span class="comment"># ... ready for the next interaction!</span>
</div>
</div>
</div>
</div>
</section>
<!-- Why Agentable Stands Apart -->
<section class="why-agentable">
<div class="container">
<h2>Why Choose Agentable?</h2>
<p>In a rapidly evolving AI landscape, Agentable offers the foundational robustness and simplicity developers need to build truly next-generation LLM applications.</p>
<div class="reason-grid">
<div class="reason-card">
<h3>Developer-First Design</h3>
<p>Intuitive API, clear documentation, and minimal boilerplate code let you focus on what matters: your agent's intelligence.</p>
</div>
<div class="reason-card">
<h3>Seamless Persistence</h3>
<p>Forget manual serialization. Agentable automatically handles saving and loading, powered by the battle-tested SQLAlchemy.</p>
</div>
<div class="reason-card">
<h3>Open-Source Power</h3>
<p>Benefit from community contributions, transparent development, and the flexibility to adapt it to your unique needs.</p>
</div>
<div class="reason-card">
<h3>Future-Proof Foundation</h3>
<p>Designed for extensibility, Agentable provides a solid base that can evolve with your agent's growing complexity and new LLM paradigms.</p>
</div>
</div>
</div>
</section>
<!-- Getting Started -->
<section class="get-started">
<div class="container">
<h2>Your Journey Starts Here.</h2>
<p>Ready to build more intelligent, persistent LLM agents? Get Agentable up and running in minutes.</p>
<div class="code-block">
<pre>
<div class="line-numbers">1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br></div><code class="code-lines">
<span class="comment"># 1. Install Agentable</span>
<span class="function">pip</span> <span class="function">install</span> agentable <span class="comment"># or pip install "agentable[sqlite]" for SQLite support</span>
<span class="comment"># 2. Basic Usage Example (Python)</span>
<span class="keyword">from</span> agentable <span class="keyword">import</span> AgentMemory, AgentState, create_session_factory
<span class="keyword">from</span> sqlalchemy <span class="keyword">import</span> create_engine
<span class="comment"># Configure your database (e.g., SQLite for simplicity)</span>
engine = <span class="function">create_engine</span>(<span class="string">"sqlite:///./agent_data.db"</span>)
<span class="comment"># Create a session factory for Agentable</span>
SessionFactory = <span class="function">create_session_factory</span>(engine)
<span class="comment"># Define a unique ID for your agent instance/user</span>
agent_id = <span class="string">"my_first_agent"</span>
<span class="comment"># Initialize AgentMemory and AgentState with a session</span>
<span class="keyword">with</span> SessionFactory() <span class="keyword">as</span> session:
memory = <span class="class">AgentMemory</span>(<span class="variable">agent_id</span>=<span class="variable">agent_id</span>, session=<span class="variable">session</span>)
state = <span class="class">AgentState</span>(<span class="variable">agent_id</span>=<span class="variable">agent_id</span>, session=<span class="variable">session</span>)
<span class="comment"># Add to memory</span>
memory.add_message(<span class="string">"user"</span>, <span class="string">"What is the capital of France?"</span>)
memory.add_scratchpad_note(<span class="string">"User asked about geography."</span>)
<span class="comment"># Update state</span>
state.set(<span class="string">"topic"</span>, <span class="string">"geography"</span>)
state.increment(<span class="string">"query_count"</span>)
<span class="comment"># Retrieve data</span>
<span class="function">print</span>(<span class="string">"Latest message:"</span>, memory.get_latest_message().content)
<span class="function">print</span>(<span class="string">"Current topic:"</span>, state.get(<span class="string">"topic"</span>))
<span class="comment"># All changes are automatically committed at the end of the 'with' block!</span>
</code>
</pre>
</div>
<div class="hero-cta-group">
<a href="https://github.com/mikehenken/agentable#documentation" target="_blank" class="btn btn-primary">Read The Full Docs</a>
<a href="https://github.com/mikehenken/agentable" target="_blank" class="btn btn-secondary">View on GitHub</a>
</div>
</div>
</section>
<!-- Final Call to Action -->
<section class="cta-final">
<div class="container">
<h2>Join The Agentable Revolution.</h2>
<p>Elevate your LLM agents from transient chatbots to truly intelligent, context-aware entities. The future of AI agent orchestration is here.</p>
<a href="https://github.com/mikehenken/agentable#getting-started" target="_blank" class="btn btn-secondary">Start Building Today</a>
</div>
</section>
<!-- Footer -->
<footer class="footer">
<div class="container">
<p>© 2024 Agentable. All rights reserved.</p>
<p>
<a href="https://github.com/mikehenken/agentable#license" target="_blank">License</a> |
<a href="https://github.com/mikehenken/agentable#contributing" target="_blank">Contribute</a> |
<a href="https://github.com/mikehenken/agentable/issues" target="_blank">Report an Issue</a>
</p>
<div class="social-icons">
<a href="https://github.com/mikehenken/agentable" target="_blank"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/GitHub_Invertocat_Logo.svg/1000px-GitHub_Invertocat_Logo.svg.png" alt="GitHub"></a>
<!-- Add other social links if desired, e.g., Twitter, LinkedIn -->
</div>
</div>
</footer>
</body>
</html>
---
### **Explanation of Design Choices & "Netflix Aesthetic" Implementation:**
1. **Dark, Immersive Backgrounds:**
* The `body` uses a deep charcoal (`--bg-primary`).
* Sections alternate with a slightly lighter charcoal (`--bg-secondary`) to create visual breaks without losing the dark theme.
* The Hero section features a `hero-background` with radial and linear gradients, along with a subtle SVG background image that mimics data streams and neural pathways, giving it a high-tech, abstract, and dynamic feel. Keyframe animations (`pulse-glow`) add subtle movement.
2. **Vibrant Accent Colors:**
* **Netflix Red (`--accent-red`):** Used primarily for the strong call-to-action buttons (e.g., "Get Started Instantly"), giving them a prominent, urgent feel. It's used sparingly to maximize impact.
* **Electric Cyan (`--accent-cyan`):** Employed for secondary CTAs, icons, links, and code highlighting. This cool tone contrasts beautifully with the deep backgrounds and offers a "digital" glow.
* **Amethyst Purple (`--accent-purple`):** Used in gradients for headings and some background effects, adding depth and a futuristic, sophisticated touch.
3. **Bold, Crisp Typography:**
* **Montserrat:** Chosen for all headings for its modern, geometric, and strong presence, echoing the confidence often seen in Netflix titles.
* **Lato:** A highly readable sans-serif for body text, ensuring that even with the verbose content, it's easy on the eyes.
* **Roboto Mono:** Essential for code blocks, maintaining clarity and a professional developer feel.
* **Text Gradients & Shadows:** Headings use `linear-gradient` and `-webkit-background-clip: text` to make them glow and stand out, a premium touch often seen in high-end interfaces. Text shadows enhance this effect.
4. **Structured, Content-Focused Layouts:**
* **`container`:** Keeps content within a readable width, common in content-heavy platforms.
* **Grids & Flexbox:** Used extensively for responsive layouts (`features-grid`, `component-grid`, `reason-grid`, `content-grid`), allowing for clear organization of information.
* **Cards:** Features, components, and problem/solution points are encapsulated in cards with subtle borders and box-shadows that lift them off the dark background, making them feel like distinct "episodes" or "features" to explore. Hover effects add interactivity.
5. **Interactive Elements & Micro-Animations:**
* **Button Animations:** `pulse-btn` for the primary CTA makes it feel alive and invites interaction. Hover effects add a slight lift and stronger shadow.
* **Card Hover Effects:** Subtle `transform: translateY` and `box-shadow` changes on hover give a sense of depth and responsiveness.
* **Feature Card Glow (`::before` pseud-element with `radial-gradient` and `rotate-glow` animation):** Adds a dynamic, internal glow to feature cards on hover, suggesting advanced tech.
* **Scroll Indicator (`bounce-arrow`):** A subtle animation at the bottom of the hero visually prompts users to scroll down, guiding them through the content, similar to Netflix's "scroll for more" interaction.
6. **"Verbose" & Informative Content Strategy:**
* Each section is designed to tell a part of Agentable's story, from identifying the core problem (`The Forgetting Frontier`) to presenting the solution (`Agentable: The Persistent Solution`), detailing its capabilities (`Beyond Simple Chats`), and guiding users to get started (`Your Journey Starts Here`).
* **Problem/Solution Section:** Explicitly lists pain points and how Agentable addresses them, structured for easy comparison.
* **Key Features:** Uses impactful icons and concise descriptions to highlight benefits.
* **Core Components:** Dedicated cards for `AgentMemory` and `AgentState`, explaining their role with illustrative (though simplified) code snippets.
* **Code Blocks:** Presented in a clean, scrollable dark box with faux syntax highlighting and line numbers for a truly developer-friendly experience.
* **Why Choose Agentable:** Reinforces unique selling points.
7. **Narrative Flow:**
* The page is structured to take the user on a journey: *Problem* → *Solution Overview* → *Detailed Features* → *How it Works (Components)* → *Why it's Better* → *Call to Action (Get Started)*. This mimics how a narrative unfolds, keeping the user engaged.
This comprehensive approach leverages visual flair, clear structure, and detailed content to create a high-quality, engaging landing page that not only informs but also excites developers about the potential of `agentable`, all while resonating with that distinctive Netflix aesthetic.