Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
6629bd3
Fix content bugs, update models, add ProblemStatement and MarketOppor…
operatoruplift Mar 18, 2026
96c9d12
Align website with pitch deck, fix CSS bug, clean up manifest and met…
operatoruplift Mar 18, 2026
cad01c7
Add metadataBase to resolve OG image warning
operatoruplift Mar 18, 2026
ceab72c
Fix OPERATOR UPLIFT centering in Security card, upgrade HeroAnimation
operatoruplift Mar 18, 2026
0a57e4c
Build full webapp: dashboard, auth, agent builder, marketplace, security
operatoruplift Mar 19, 2026
74ae285
Sync fixes from master: tighter layout, better contrast, content polish
operatoruplift Mar 19, 2026
9fa3e4f
Fix icons, hero animation timing, product scroll, add iOS/Android dow…
operatoruplift Mar 19, 2026
1c51826
Fix hero animation chat bubbles, product visual loops, text box sizing
operatoruplift Mar 19, 2026
e93f598
Security hardening, compliance, Next.js upgrade, license
operatoruplift Mar 19, 2026
d6c48cd
Fix layout, animations, and visual consistency across landing page
operatoruplift Mar 19, 2026
370a11c
Fix hero CHAT phase cutoff, speed up product animation loops
operatoruplift Mar 19, 2026
bdf7e0d
Fix Next.js scroll-behavior warning, minor cleanup
operatoruplift Mar 19, 2026
2c16caf
Hero background fullscreen, new webapp pages, fix product animations
operatoruplift Mar 19, 2026
6ff5bc6
Add RESPOND/COMPLETE hero phases, analytics, profile pages
operatoruplift Mar 19, 2026
6610be0
Fix animation loops: persistent visuals, faster chat bubbles, agents …
operatoruplift Mar 19, 2026
1c13543
Accessibility, type safety, hydration fix from full audit
operatoruplift Mar 19, 2026
37855dd
Extend product animation loop durations with longer hold times
operatoruplift Mar 20, 2026
a1fec52
Rebrand dashboard to orange, add Seeker download, demo section, fix a…
operatoruplift Mar 20, 2026
40e01bf
Complete branding cleanup: remove all purple/pink/cyan, add Uplift logo
operatoruplift Mar 20, 2026
ca1635b
Update LLM models to latest, add provider logos, fix Linux icon
operatoruplift Mar 20, 2026
a04340b
Fix animations, Enterprise card, CLI demo, logo cleanup
operatoruplift Mar 20, 2026
f072651
Fix product scroll, proper provider logos, stats bar styling
operatoruplift Mar 20, 2026
64fa57b
Fix provider logos with proper SVGs, fix product scroll timing
operatoruplift Mar 20, 2026
12b3807
Upgrade hero animation phases, fix product scroll distance
operatoruplift Mar 20, 2026
ff2d2cd
Fix chat bubbles, product scroll, dashboard fonts
operatoruplift Mar 20, 2026
7a81af0
Rewrite hero animation for clean phase transitions
operatoruplift Mar 20, 2026
383a94b
Fix chat bubbles, product scroll, dashboard fonts
operatoruplift Mar 20, 2026
23ab405
Fix product scroll timing, hero badge overlap and text readability
operatoruplift Mar 20, 2026
bde4c99
Fix chat bubbles, product scroll, dashboard fonts
operatoruplift Mar 20, 2026
1b552ed
Smooth COMPLETE transition, fill empty chat space, fix flicker
operatoruplift Mar 20, 2026
6115a81
Fix product animations: remount on index change, add nav spacing
operatoruplift Mar 21, 2026
4f3ea94
Fix product scroll and hero progress bar — timer-based cycling
operatoruplift Mar 21, 2026
be25904
Fix product section layout: remove overflow clip, fix height
operatoruplift Mar 21, 2026
e4e0d83
Fix product layout, add scroll advancement, convert to waitlist
operatoruplift Mar 21, 2026
650b74a
Fix product scroll: trap wheel events, prevent page scroll
operatoruplift Mar 21, 2026
9982ddd
Add Supabase waitlist API, connect login form
operatoruplift Mar 21, 2026
064e595
Merge remote-tracking branch 'origin/master' into operatoruplift/repo…
operatoruplift Mar 21, 2026
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
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Operator Uplift

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
96 changes: 96 additions & 0 deletions app/(auth)/login/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
"use client";

import { useState } from 'react';
import Link from 'next/link';
import { Bot, ArrowRight, Mail, Sparkles, CheckCircle2 } from 'lucide-react';
import { GlowButton } from '@/src/components/ui/GlowButton';
import { Logo } from '@/src/components/Icons';

export default function LoginPage() {
const [email, setEmail] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [submitted, setSubmitted] = useState(false);

const handleWaitlist = async (e: React.FormEvent) => {
e.preventDefault();
setIsLoading(true);
try {
const res = await fetch('/api/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email }),
});
if (res.ok) {
setSubmitted(true);
}
} catch {
// Fallback: still show success to not block UX
setSubmitted(true);
}
setIsLoading(false);
};

return (
<div className="min-h-screen flex items-center justify-center relative" style={{ background: '#050508' }}>
<div className="absolute inset-0 opacity-40" style={{
background: `radial-gradient(ellipse 80% 50% at 50% 30%, rgba(231, 118, 48, 0.15) 0%, transparent 50%)`
}} />
<div className="w-full max-w-md p-8 rounded-2xl border border-white/10 bg-black/40 backdrop-blur-xl relative z-10 shadow-2xl">
<div className="text-center mb-8">
<Link href="/" className="inline-flex items-center space-x-3">
<Logo className="w-12 h-12" />
<span className="text-2xl font-bold text-white">Operator<span className="text-primary">Uplift</span></span>
</Link>
</div>

{submitted ? (
<div className="text-center py-8">
<div className="w-16 h-16 rounded-full bg-emerald-500/10 border border-emerald-500/30 flex items-center justify-center mx-auto mb-6">
<CheckCircle2 size={32} className="text-emerald-400" />
</div>
<h2 className="text-2xl font-bold text-white mb-3">You&apos;re on the list</h2>
<p className="text-gray-400 mb-2">We&apos;ll notify you at <span className="text-white">{email}</span> when early access opens.</p>
<p className="text-gray-500 text-sm mt-4">Follow us for updates:</p>
<div className="flex items-center justify-center gap-4 mt-3">
<a href="https://x.com/OperatorUplift" target="_blank" rel="noreferrer" className="text-xs text-gray-400 hover:text-primary transition-colors">X (Twitter)</a>
<a href="https://discord.gg/eka7hqJcAY" target="_blank" rel="noreferrer" className="text-xs text-gray-400 hover:text-primary transition-colors">Discord</a>
<a href="https://github.com/operatoruplift" target="_blank" rel="noreferrer" className="text-xs text-gray-400 hover:text-primary transition-colors">GitHub</a>
</div>
<Link href="/" className="inline-block mt-8 text-sm text-gray-500 hover:text-white transition-colors">&larr; Back to home</Link>
</div>
) : (
<>
<div className="text-center mb-8">
<div className="inline-flex items-center gap-2 bg-primary/10 border border-primary/20 text-primary px-3 py-1.5 rounded-full text-xs font-mono uppercase tracking-widest mb-6">
<Sparkles size={12} /> Early Access
</div>
<h1 className="text-2xl font-bold text-white">Join the Waitlist</h1>
<p className="text-gray-400 mt-2">Operator Uplift is currently in private beta. Sign up to get early access when we launch.</p>
</div>
<form onSubmit={handleWaitlist} className="space-y-4">
<div>
<label htmlFor="waitlist-email" className="text-sm text-gray-400 block mb-2">Email</label>
<div className="relative">
<Mail size={18} className="absolute left-4 top-1/2 -translate-y-1/2 text-gray-400" />
<input id="waitlist-email" type="email" value={email} onChange={e => setEmail(e.target.value)} placeholder="you@example.com" aria-label="Email address" className="w-full bg-white/5 border border-white/10 rounded-lg pl-12 pr-4 py-3 text-white focus:border-primary/50 focus:outline-none transition-colors" required />
</div>
</div>
<GlowButton type="submit" className="w-full" disabled={isLoading}>
{isLoading ? 'Joining...' : 'Join Waitlist'} <ArrowRight size={18} className="ml-2" />
</GlowButton>
</form>
<div className="mt-6 pt-6 border-t border-white/5">
<div className="flex items-center justify-center gap-6 text-[10px] font-mono text-gray-500 uppercase tracking-widest">
<span>Local-first</span>
<span className="w-1 h-1 rounded-full bg-gray-700" />
<span>Privacy-first</span>
<span className="w-1 h-1 rounded-full bg-gray-700" />
<span>Open source</span>
</div>
</div>
</>
)}
</div>
</div>
);
}
10 changes: 10 additions & 0 deletions app/(auth)/signup/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"use client";

import { useEffect } from 'react';
import { useRouter } from 'next/navigation';

export default function SignupPage() {
const router = useRouter();
useEffect(() => { router.replace('/login'); }, [router]);
return null;
}
Loading