diff --git a/site/index.html b/site/index.html index cf2b43a..a13cd56 100644 --- a/site/index.html +++ b/site/index.html @@ -54,41 +54,61 @@
Some of what people listen to and read on iPX servers today.
- -
-

In the browser

-

Everyone signs in to a list of their own: feeds down the side, episodes in a table with each one's notes below, and the player along the bottom, as iPodderX laid them out.

-
- iPX in a desktop browser: the feed list down the side, 99% Invisible's episodes in a table, the newest one's notes below it, and the player along the bottom. -
-
- -
- iPX on a phone: Ologies with Alie Ward and its latest episodes. -
-

On your phone

-

Add it to your home screen and it opens like an app, with the same lists and the same place in each episode as on your computer.

-
-
- +

What it does

-
-
Everyone gets their own list
-
Each person subscribes, reads and listens at their own pace, and picks up where they left off on any device. However many of you want an episode, there is one copy on disk.
-
It does the fetching
-
Feeds are checked on a schedule and new episodes download on their own, filtered by keyword, media type or explicit content. Old files are cleared to stay within the disk space you give it, never one somebody pinned.
+ +
+
+

Everyone gets their own list

+

Each person signs in to their own feeds, with their own unread counts, pins and place in every episode. However many of you want an episode, there is one copy on disk.

+
+
The feed list: Directory, Currently Listening and All Subscriptions, then each show with its cover and how many of its episodes are unread.
+
+ +
+
+

It does the fetching

+

Feeds are checked on a schedule and new episodes download on their own, filtered by keyword, media type or explicit content. Old files are cleared to stay within the disk space you give it, never one somebody pinned.

+
+
99% Invisible's episodes in a table with each one's size and date, and the downloaded one's file beside it, ready to play, save, share or delete.
+
+ +
+
+

Pick up where you left off

+

The player keeps your place in every episode, on every device. Turn on DeadAir for a show and it plays without the long silences, leaving the pause you choose.

+
+
The player along the bottom of the page: the episode playing, back and forward, how far in it is, its speed and the volume.
+
+ +
+
+

On your phone

+

Add it to your home screen and it opens like an app, with the same lists and the same place in each episode as on your computer.

+
+ iPX on a phone: Ologies with Alie Ward and its latest episodes. +
+ +
+
+

A shared directory

+

iPX servers can share the public shows their people follow. Browse the directory to find something new, and subscribe in one click from your own server.

+
+
The directory's most subscribed shows, each with its cover and how many people subscribe.
+
+ +
BitTorrent too
A show published as a torrent downloads like any other. iPX joins the swarm, seeds back until the ratio or time you set, and gives up on one that stalls. A slow swarm never holds up the rest.
Subscribe to a whole list
Give iPX the address of an OPML list and it keeps a folder in step with it, as whoever keeps the list adds and drops shows. Your own subscriptions import and export as OPML too.
-
DeadAir
-
Turn it on for a show and iPX plays it without its long silences, leaving the pause you choose. The original file stays as it is.
-
A shared directory
-
iPX servers can share the public shows their people follow. Browse it to find something new, and subscribe in one click from your own server.
Sign in your way
Each person signs in with a password, or Cloudflare Access or Authentik signs them in for you. An admin adds people and decides who else is one.
Blogs too
diff --git a/site/shots/desktop.webp b/site/shots/desktop.webp deleted file mode 100644 index e8c6dbb..0000000 Binary files a/site/shots/desktop.webp and /dev/null differ diff --git a/site/shots/directory.webp b/site/shots/directory.webp new file mode 100644 index 0000000..1c92e55 Binary files /dev/null and b/site/shots/directory.webp differ diff --git a/site/shots/episodes.webp b/site/shots/episodes.webp new file mode 100644 index 0000000..408776c Binary files /dev/null and b/site/shots/episodes.webp differ diff --git a/site/shots/feeds.webp b/site/shots/feeds.webp new file mode 100644 index 0000000..a3f62af Binary files /dev/null and b/site/shots/feeds.webp differ diff --git a/site/shots/player.webp b/site/shots/player.webp new file mode 100644 index 0000000..ab38c6e Binary files /dev/null and b/site/shots/player.webp differ diff --git a/site/site.css b/site/site.css index 7eda3f7..c7111fe 100644 --- a/site/site.css +++ b/site/site.css @@ -62,22 +62,21 @@ h1{margin:0;color:var(--navy);font-weight:900;font-size:clamp(6.5rem,24vw,15rem) @media (prefers-reduced-motion:reduce){.needle,.stations .tuned{animation-duration:0s;animation-delay:0s}} figcaption{margin:.7rem 0 0;color:var(--muted);font-size:.9rem} -/* The app as it looks. The window framed in a navy panel, the dial's material, even on every - side; the phone in a row of its own beside what it shows, not over the window's corner. */ -.shots{padding-block:4.5rem 0} -.shotlede{max-width:40rem;margin:-.5rem 0 1.75rem} -.window{margin:0;padding:clamp(1rem,3.2vw,2.5rem);background:var(--navy);border-radius:1.25rem} -.window img{display:block;width:100%;height:auto;border-radius:.6rem;box-shadow:0 0 0 1px rgba(143,194,234,.22)} -.pocket{display:grid;grid-template-columns:minmax(0,14rem) minmax(0,1fr);gap:clamp(2rem,7vw,5.5rem);align-items:center;padding-block:4rem 0} -.pocket img{display:block;width:100%;height:auto;border-radius:1.9rem;border:.45rem solid var(--navy)} -.pocket h2{margin-bottom:.75rem} -.pocket p{margin:0;max-width:28rem;font-size:1.125rem} - h2{margin:0 0 1.5rem;color:var(--navy);font-weight:800;font-size:clamp(1.75rem,4vw,2.4rem);line-height:1.1;letter-spacing:-.02em} .does,.then{padding-block:4rem 0} -.does dl{margin:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2.25rem 3.5rem} -.does dt{color:var(--navy);font-weight:750;font-size:1.2rem;line-height:1.25} -.does dd{margin:.45rem 0 0;max-width:34rem} +/* Each feature beside the part of the app that shows it, framed in the dial's navy at no more + than its own size; the player, a long thin bar, takes the full width under its text. */ +.feature{display:grid;grid-template-columns:minmax(0,19rem) minmax(0,1fr);gap:clamp(1.5rem,5vw,4rem);align-items:center;padding-block:2.5rem} +.feature.wide{grid-template-columns:minmax(0,1fr)} +.feature.wide .say{max-width:40rem} +.feature h3{margin:0 0 .5rem;color:var(--navy);font-weight:750;font-size:1.35rem;line-height:1.25} +.feature p{margin:0;max-width:34rem} +.frame{margin:0;justify-self:start;max-width:100%;padding:clamp(.6rem,1.6vw,1.1rem);background:var(--navy);border-radius:1.1rem} +.frame img{display:block;max-width:100%;height:auto;border-radius:.55rem} +.feature.phone>img{justify-self:start;display:block;width:100%;max-width:14rem;height:auto;border-radius:1.9rem;border:.45rem solid var(--navy)} +.also{margin:2rem 0 0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2.25rem 3.5rem} +.also dt{color:var(--navy);font-weight:750;font-size:1.2rem;line-height:1.25} +.also dd{margin:.45rem 0 0;max-width:34rem} .then p{max-width:40rem} @@ -88,12 +87,12 @@ footer p{margin:0} main,.bar,footer{padding-inline:1rem} .bar nav{gap:1rem} .hero{padding-block:1.5rem 2rem} - .does dl{grid-template-columns:minmax(0,1fr);gap:1.75rem} - .window{margin-inline:-1rem;border-radius:0} - /* The whole window at this width is too small to read: its left part, larger. */ - .window img{height:20rem;object-fit:cover;object-position:0 0} - .pocket{grid-template-columns:minmax(0,1fr);gap:1.5rem} - .pocket img{order:2;width:58%;max-width:14rem} + .feature{grid-template-columns:minmax(0,1fr);gap:1.25rem;padding-block:1.75rem} + .feature.phone>img{width:62%} + /* A wide crop at this width is too small to read: its left part, larger. */ + .frame img.cut{width:100%;aspect-ratio:4/3;object-fit:cover;object-position:0 0} + .frame img.cut.bar{aspect-ratio:2.4/1} + .also{grid-template-columns:minmax(0,1fr);gap:1.75rem} .dial{margin-inline:-1rem} .scale{border-radius:0} figcaption{padding-inline:1rem}