From 12e2242114184746543f014d935cc4c4283fb0ce Mon Sep 17 00:00:00 2001 From: Pratyush Sharma <56130065+pratyush618@users.noreply.github.com> Date: Sun, 3 May 2026 03:11:02 +0530 Subject: [PATCH] feat(docs-next): polish landing page (phase 5) Replaces the Phase 1 stub home page with a richer hero (typed code preview, version pill, CTAs), a 6-card feature grid backed by lucide icons (brokerless, Rust-powered, async-first, DAG workflows, resource system, production-ready), a tabbed taskito-vs-Celery+Redis comparison showing the same task in both stacks, and a closing CTA card. --- .../docs/guides/observability/meta.json | 8 +- docs-next/src/app/(home)/comparison.tsx | 129 +++++++++ docs-next/src/app/(home)/page.tsx | 258 +++++++++++++++--- 3 files changed, 352 insertions(+), 43 deletions(-) create mode 100644 docs-next/src/app/(home)/comparison.tsx diff --git a/docs-next/content/docs/guides/observability/meta.json b/docs-next/content/docs/guides/observability/meta.json index 6eb266f..9e2a24d 100644 --- a/docs-next/content/docs/guides/observability/meta.json +++ b/docs-next/content/docs/guides/observability/meta.json @@ -1,10 +1,4 @@ { "title": "Observability", - "pages": [ - "index", - "monitoring", - "logging", - "dashboard", - "dashboard-api" - ] + "pages": ["index", "monitoring", "logging", "dashboard", "dashboard-api"] } diff --git a/docs-next/src/app/(home)/comparison.tsx b/docs-next/src/app/(home)/comparison.tsx new file mode 100644 index 0000000..d7f0ea6 --- /dev/null +++ b/docs-next/src/app/(home)/comparison.tsx @@ -0,0 +1,129 @@ +"use client"; + +import { useState } from "react"; + +type Stack = "taskito" | "celery"; + +const STACKS: Record< + Stack, + { + label: string; + services: string; + install: string; + code: string; + } +> = { + taskito: { + label: "taskito", + services: "1 process", + install: "pip install taskito", + code: `from taskito import Queue + +queue = Queue(db_path="tasks.db") + +@queue.task(max_retries=3, rate_limit="100/m") +def send_email(to, subject, body): + smtp.send(to, subject, body) + +# Enqueue +send_email.delay("alice@example.com", "Hi", "Body") + +# Run the worker +# $ taskito worker --app tasks:queue`, + }, + celery: { + label: "Celery + Redis", + services: "3 processes (Redis + worker + beat)", + install: "pip install celery[redis]\n# also: install + run Redis server", + code: `from celery import Celery + +app = Celery( + "myapp", + broker="redis://localhost:6379/0", + backend="redis://localhost:6379/1", +) +app.conf.task_default_rate_limit = "100/m" + +@app.task(bind=True, max_retries=3) +def send_email(self, to, subject, body): + try: + smtp.send(to, subject, body) + except SMTPError as exc: + raise self.retry(exc=exc, countdown=60) + +# Enqueue +send_email.delay("alice@example.com", "Hi", "Body") + +# Run the worker (in a separate terminal, plus Redis) +# $ celery -A myapp worker --loglevel=info`, + }, +}; + +export function Comparison() { + const [stack, setStack] = useState("taskito"); + const data = STACKS[stack]; + + return ( +
+
+ {(Object.keys(STACKS) as Stack[]).map((key) => { + const active = stack === key; + return ( + + ); + })} +
+
+ + + +
+
+        {data.code}
+      
+
+ ); +} + +function Stat({ + label, + value, + mono, +}: { + label: string; + value: string; + mono?: boolean; +}) { + return ( +
+
+ {label} +
+
+ {value} +
+
+ ); +} diff --git a/docs-next/src/app/(home)/page.tsx b/docs-next/src/app/(home)/page.tsx index 18041ee..b1869ae 100644 --- a/docs-next/src/app/(home)/page.tsx +++ b/docs-next/src/app/(home)/page.tsx @@ -1,52 +1,238 @@ +import { + Activity, + ArrowRight, + Cpu, + Layers, + Shield, + Workflow, + Zap, +} from "lucide-react"; import Link from "next/link"; +import { Comparison } from "./comparison"; export default function HomePage() { return (
-
-

Taskito

-

- Rust-powered task queue for Python. Replace Celery without Redis. - Start with SQLite, scale to Postgres. No broker required. + + + + +

+ ); +} + +function Hero() { + return ( +
+
+
+
+
+ + v0.12 — Rust core, native async, DAG workflows +
+

+ Task queue +
+ without the broker. +

+

+ Rust-powered task queue for Python. Replace Celery without Redis or + RabbitMQ. Start with SQLite, scale to Postgres. +

+
+ + Quickstart + + + + Install + + + GitHub → + +
+
+ +
+
+ ); +} + +function CodePreview() { + return ( +
+
+
+
+
+
+
+ + tasks.py + +
+
+        
+          
+            # pip install taskito
+          
+          {"\n"}
+          from{" "}
+          taskito{" "}
+          import{" "}
+          Queue{"\n\n"}
+          queue ={" "}
+          Queue
+          (db_path=
+          
+            "tasks.db"
+          
+          ){"\n\n"}
+          @queue.task()
+          {"\n"}
+          def{" "}
+          add(a, b):
+          {"\n"}
+          {"    "}
+          return a
+          + b{"\n\n"}
+          job = add.
+          delay(
+          2,{" "}
+          3){"\n"}
+          print(job.
+          result())
+          {"  "}
+          # 5
+        
+      
+
+ ); +} + +const FEATURES = [ + { + icon: Zap, + title: "Brokerless", + body: "No Redis, no RabbitMQ. Everything in a single SQLite file — queue, results, rate limits, schedules. Just `pip install` and go.", + }, + { + icon: Cpu, + title: "Rust-powered", + body: "The scheduler, dispatcher, and storage engine are all Rust. Tokio runtime, OS-thread worker pool, thin PyO3 boundary keeps the Python overhead negligible.", + }, + { + icon: Activity, + title: "Async-first", + body: "`async def` tasks dispatch onto a dedicated event loop — no `asyncio.run()` wrapping, no thread-pool bridging. Sync and async tasks coexist transparently.", + }, + { + icon: Workflow, + title: "DAG workflows", + body: "Multi-step pipelines as directed acyclic graphs. Fan-out, fan-in, conditions, approval gates, sub-workflows, incremental re-runs, Mermaid visualization.", + }, + { + icon: Layers, + title: "Resource system", + body: "Inject database connections, HTTP clients, and cloud SDKs by name. Three-layer pipeline: argument interception, worker DI, transparent proxy reconstruction.", + }, + { + icon: Shield, + title: "Production-ready", + body: "Retries with exponential backoff, dead letter queue, rate limits, circuit breakers, distributed locks, structured logs, OTel/Sentry/Prometheus middleware.", + }, +]; + +function Features() { + return ( +
+
+

+ What you get +

+

+ The convenience of Celery, the performance of Rust, the simplicity of + SQLite.

-
+
+
+ {FEATURES.map(({ icon: Icon, title, body }) => ( +
+
+ +
+

{title}

+

+ {body} +

+
+ ))} +
+
+ ); +} + +function ComparisonSection() { + return ( +
+
+

+ Less to operate +

+

+ The same task, two stacks. Pick the one with fewer moving parts. +

+
+ +
+ ); +} + +function CTA() { + return ( +
+
+

+ Five minutes from{" "} + pip install to your + first job. +

+

+ The quickstart walks you through defining a task, enqueuing it, and + watching the worker run it — no Redis, no broker, no config. +

+
- Quickstart + Start the quickstart + - Install + See the full comparison
-
-
-
-

Brokerless

-

- Start with SQLite, scale to Postgres. No Redis or RabbitMQ to - install, configure, or operate. -

-
-
-

Rust-powered

-

- Scheduler, dispatcher, and storage are Rust. Async worker pool, - native tokio runtime, thin PyO3 boundary. -

-
-
-

Python-native

-

- Decorate a function. Async tasks, periodic schedules, DAG workflows, - resource injection — all from a clean Python API. -

-
-
- +
+ ); }