summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Sima <ben@bensima.com>2025-12-16 16:17:47 -0500
committerBen Sima <ben@bensima.com>2025-12-16 16:17:47 -0500
commit451b3421313a53b3e7ab15d95fd4b1231f5b7773 (patch)
treef99837f0a2df4fc23c1d0ee292873b8378adac6d
parent260b7b83b0ec396bb880038f4c93f977af0056c5 (diff)
Update homepage with marketing copy and fix push.sh
-rw-r--r--Biz/PodcastItLater/Web.py119
-rwxr-xr-xOmni/Ide/push.sh21
2 files changed, 122 insertions, 18 deletions
diff --git a/Biz/PodcastItLater/Web.py b/Biz/PodcastItLater/Web.py
index 257938f..bc12000 100644
--- a/Biz/PodcastItLater/Web.py
+++ b/Biz/PodcastItLater/Web.py
@@ -906,19 +906,114 @@ class HomePage(Component[AnyChildren, HomePageAttrs]):
error = self.attrs.get("error")
if not user:
- # Show public feed with login form for logged-out users
+ # Marketing landing page for logged-out users
return UI.PageLayout(
- LoginForm(error=error),
+ # Hero section
html.div(
- html.h4(
- html.i(classes=["bi", "bi-broadcast", "me-2"]),
- "Public Feed",
- classes=["mb-3", "mt-4"],
+ html.h1(
+ "Your Reading List, Now a Podcast",
+ classes=["display-5", "fw-bold", "mb-3"],
),
html.p(
- "Featured articles converted to audio. "
- "Sign up to create your own personal feed!",
- classes=["text-muted", "mb-3"],
+ "Convert web articles to audio. "
+ "Listen during your commute, workout, or chores.",
+ classes=["lead", "text-muted", "mb-4"],
+ ),
+ html.a(
+ "Start Listening",
+ href="#login",
+ classes=["btn", "btn-primary", "btn-lg"],
+ ),
+ classes=["text-center", "py-5", "mb-5"],
+ ),
+ # How it works section
+ html.div(
+ html.h3(
+ "How It Works",
+ classes=["text-center", "mb-4"],
+ ),
+ html.div(
+ html.div(
+ html.div(
+ html.div(
+ html.span(
+ "1",
+ classes=[
+ "badge",
+ "bg-primary",
+ "rounded-circle",
+ "fs-5",
+ "mb-3",
+ ],
+ ),
+ html.h5("Paste any article URL"),
+ html.p(
+ "Copy the link to any article you want to listen to.",
+ classes=["text-muted", "small"],
+ ),
+ classes=["card-body", "text-center"],
+ ),
+ classes=["card", "h-100"],
+ ),
+ classes=["col-md-4", "mb-3"],
+ ),
+ html.div(
+ html.div(
+ html.div(
+ html.span(
+ "2",
+ classes=[
+ "badge",
+ "bg-primary",
+ "rounded-circle",
+ "fs-5",
+ "mb-3",
+ ],
+ ),
+ html.h5("We convert it to audio"),
+ html.p(
+ "Our AI reads the article and creates a podcast episode.",
+ classes=["text-muted", "small"],
+ ),
+ classes=["card-body", "text-center"],
+ ),
+ classes=["card", "h-100"],
+ ),
+ classes=["col-md-4", "mb-3"],
+ ),
+ html.div(
+ html.div(
+ html.div(
+ html.span(
+ "3",
+ classes=[
+ "badge",
+ "bg-primary",
+ "rounded-circle",
+ "fs-5",
+ "mb-3",
+ ],
+ ),
+ html.h5("Listen in your podcast app"),
+ html.p(
+ "Subscribe to your personal RSS feed in any podcast app.",
+ classes=["text-muted", "small"],
+ ),
+ classes=["card-body", "text-center"],
+ ),
+ classes=["card", "h-100"],
+ ),
+ classes=["col-md-4", "mb-3"],
+ ),
+ classes=["row"],
+ ),
+ classes=["mb-5"],
+ ),
+ # Social proof section
+ html.div(
+ html.h4(
+ "Join others who've converted their reading backlog",
+ classes=["text-center", "mb-4"],
),
EpisodeList(
episodes=episodes,
@@ -926,6 +1021,12 @@ class HomePage(Component[AnyChildren, HomePageAttrs]):
user=None,
viewing_own_feed=False,
),
+ classes=["mb-5"],
+ ),
+ # Login form
+ html.div(
+ LoginForm(error=error),
+ id="login",
),
user=None,
current_page="home",
diff --git a/Omni/Ide/push.sh b/Omni/Ide/push.sh
index 25c0ed6..f6d67f4 100755
--- a/Omni/Ide/push.sh
+++ b/Omni/Ide/push.sh
@@ -77,22 +77,25 @@ service_deploy() {
echo -e "${YLW}info: push: deploying service $service_name${NC}"
- # 1. Build and cache (bild caches by default, outputs STORE_PATH=...)
+ # 1. Build and cache
echo -e "${YLW}info: push: building $target${NC}"
- local bild_output
- bild_output=$(bild "$target" 2>&1) || {
+ if ! bild "$target"; then
echo -e "${RED}fail: push: bild failed${NC}"
- echo "$bild_output"
exit 1
- }
+ fi
+
+ # Get store path from symlink in _/nix/
+ local symlink_path="${CODEROOT}/_/nix/${service_name}"
+ if [[ ! -L "$symlink_path" ]]; then
+ echo -e "${RED}fail: push: symlink not found: $symlink_path${NC}"
+ exit 1
+ fi
- # Extract store path from bild output
local store_path
- store_path=$(echo "$bild_output" | grep '^STORE_PATH=' | cut -d= -f2)
+ store_path=$(readlink "$symlink_path")
if [[ -z "$store_path" ]]; then
- echo -e "${RED}fail: push: could not extract store path from bild output${NC}"
- echo "$bild_output"
+ echo -e "${RED}fail: push: could not read store path from symlink${NC}"
exit 1
fi