Skip to content

Add shinychat R 0.5.0 and Python 0.7.1 release post - #398

Merged
gadenbuie merged 29 commits into
mainfrom
blog/shinychat-v0.5.0
Sep 13, 2026
Merged

gadenbuie merged 29 commits into
mainfrom
blog/shinychat-v0.5.0

Conversation

@gadenbuie

Copy link
Copy Markdown
Contributor

Summary

Adds the shinychat release post for R 0.5.0 and Python 0.7.1, scheduled to publish Tuesday, Sept 15.

Contents:

  • index.qmd and rendered index.md for the post
  • 20 screenshots, optimized with oxipng (lossless), and three demo videos
  • apps/ with the demo apps plus the R harness used to capture the screenshots and videos
  • og-header social preview card

Verification

uv run scripts/validate-blog-posts.py content/blog/shinychat-v0.5.0/index.md passes. Preview with just dev all or via the Netlify PR preview.

Apply a writing-skills pass to the shinychat v0.5.0 (R) and v0.7.0
(Python) release post. Add an early upgrade note for existing apps,
retile the post around building complete chat applications, add a
toolbar section covering toolbar, toolbar_global, and toolbar_input
(verified against the shinychat APIs), settle the dynamic greeting
example on the fresh-client pattern with a session-scoped client, and
move screenshot TODOs to the tops of their sections.
Link the R and Python package names in the opening sentence to their
documentation sites.
Chromote-based capture harness that starts each demo app, drives it
through a scripted session, and records the screenshots and videos for
the shinychat 0.5.0 release post. Demo apps run on a mock ellmer client
so no network calls are made.
Drop four videos and three images that repeated adjacent content, and
add captures for thinking (Thought for 4s), the stop button, attachments,
and the nav-pages-plus-drawer layout. Clip the history search and actions
menu to the drawer, shift the tool-call clips down a few pixels, and
anchor the citations popover beside its pill.

Fix two capture quirks in the process: captureBeyondViewport re-renders
distorted the focused composer and the sidebar while searching, so those
clips now capture without it, and union_png's union box under-measured
when later elements extended above or left of the first match.
Replace actionButton() with bslib::toolbar_input_button() in the
page_chat() toolbar examples and add an example pairing a global
toolbar button with an offcanvas panel. Update the toolbars demo app,
screenshot script, and regenerate the section screenshots.
The union_png() message crops started 32px above the top message,
which caught the bottom border of the page header in the first few
pixels. Shift the clip region down (dy = 14) so the border is out of
frame, and regenerate the tool-calls, edit-branches, citations, and
thinking screenshots.
Split the section into four subsections: Drawer, Toolbars, Offcanvas,
and Putting it all together. The drawer leads with a new minimal
chat_drawer() example, the toolbar_input paragraph moves under the
toolbars heading, and the composed page_chat() example closes the
section with its own subsection.
Drive the edit-branches recording with a fake pointer: it enters from
the right edge, reveals the edit button via hover, clicks it, deletes
"South America?" from the edit box, retypes "Asia?" with natural
per-character timing, clicks send, then moves between the branch
navigation arrows.

The recorder gains an optional screenshot clip so the video shows only
the conversation (no header or input) while staying exactly 4:3; the
clip's top edge is clamped below the chat header to keep its border
out of frame. Cursor placement divides by the root CSS zoom, which
otherwise renders fixed elements at a scaled offset.
Add apps/og-header, a page_chat demo that renders the post's open
graph image: the shinychat hex sticker, the post title, and version
suggestion cards for R and Python on a light tint of the brand blue.
The screenshot script captures a 1200x630 viewport and writes
images/og-header.png, now used as the post image.
The recording now opens on a blank slate (greeting and suggestions
only, sidebar and drawer closed) and a fake pointer drives the whole
demo: it picks the season-summary suggestion, watches the tool
activity rows stream in ahead of the answer text, retreats while the
reader looks over the reply, then opens the history sidebar, starts a
new conversation, types the colonies question into the input with
natural per-character timing, and submits with Enter. That response
opens the artifact drawer with the plot. The pointer returns to the
first conversation via the sidebar, closes the drawer, starts another
conversation, and hides the sidebar so the video ends where it began.

Supporting harness changes:

- mock_stream_reply() streams rich replies through chat_append(): tool
  requests appear as running rows before their results land and text
  streams word by word; an on_done hook opens the drawer after the
  last chunk
- mock_record() accepts ellmer content lists so restored conversations
  replay the full reply (tool rows, citations) instead of a plain-text
  placeholder
- _common.R gains press_enter() and rect_of_text() (locate an element
  matching a selector and containing text, for gliding to a specific
  history entry)
- the complete-app demo adds a second reply with its own tool call,
  keeps the drawer closed for the first response, and starts with the
  history sidebar closed; the drawer plot is now the colony comparison
- Give every level-2 section zero or 2+ level-3 subsections
- Reorder greeting/suggestions subsection so each topic appears once
- Rewrite citations section around provider-supported citations, with
  R and Python examples for hand-rolled asides
- Fix prose/code mismatches (slash command modal, standalone helper,
  per-user history scope) and assorted line-level issues
- Add acknowledgements for 25 contributors since r/v0.3.0
The input was caught half-faded in greeting-suggestions-greeting.png;
wait 1s after focusing so the composer entrance animation finishes.
Cross-post links use dated permalinks, matching the convention used
elsewhere in the blog; the previous relative index.qmd links 404ed.
Also fix those and link shiny-side-of-llms part 3, shinychat tool UI,
raghilda, and querychat, plus Shiny bookmarking, Connect persistent
storage, ellmer/chatlas tool-calling, and shinychat guide docs.
Stream the replies with longer block and word delays so tool calls
are revealed more sequentially, pause between focusing the input and
typing the second question, re-show the greeting when a new
conversation is created, and close the artifact drawer before
switching conversations so the video ends on the blank slate it
opened with.
Run oxipng -o max --strip safe over the 20 PNGs in the post; saves
627 KiB (31%) with no visual change.
@netlify

netlify Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for posit-open-source canceled.

Name Link
🔨 Latest commit 61e509b
🔍 Latest deploy log https://app.netlify.com/projects/posit-open-source/deploys/6aa461774ce0b8000839ce91

@github-actions

github-actions Bot commented Sep 10, 2026 •

Copy link
Copy Markdown
Contributor

Publishing checklist

  • Get a review — you're responsible for requesting one. Any colleague with Write access can approve; if your PR touches files outside a post folder, the assigned code owner's approval is also required before merging
  • Check your post — once the deploy preview is ready, a comment will appear with direct links to your post
  • Check the blog listing — confirm your post appears with the correct title, image, and description
  • Merge — once everything looks good and you have an approving review, merge to main

@github-actions

github-actions Bot commented Sep 10, 2026 •

Copy link
Copy Markdown
Contributor

@gadenbuie
gadenbuie requested a review from cpsievert September 10, 2026 20:56
@gadenbuie
gadenbuie marked this pull request as ready for review September 10, 2026 20:57

@cpsievert cpsievert left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On one hand, I do appreciate that this reads like a end-to-end user guide for building a complete chat application; however, I'm not sure it's the best approach for a release blog post.

As currently written, it's hard for a drive-by viewer to quickly see how many nice new features just come for free now (i.e., history, edit/cancel, attachments, etc), and which things you have to learn about and build with yourself in order to get a "full-blown" chat app.

I think part of this is a result of the decision to dive straight into page_chat() and weave the features though a wholistic linear story. I can see the appeal as a nice getting started example, but by starting toolbars, navbars, etc., it feels like we're burying the lede. It's also hard to separate what's new and what's not.

If it were me, I would approach things this way:

  1. In the intro section, give the getting started page_chat() snippet along with the "complete" video. Along with the video, link to a later "deep-dive" into page_chat().
  2. After the intro, get into all the stuff you now get for free with chat_server().
  3. Highlight a few new "opt-in" things like slash commands, web search, etc.
  4. Cover "chat-first" applications with page_chat()
    • Here you could also get into the specifics of greetings, suggestions, etc.

Comment thread content/blog/shinychat-v0.5.0/index.qmd Outdated
Comment thread content/blog/shinychat-v0.5.0/index.qmd Outdated
Comment thread content/blog/shinychat-r-0.5.0-python-0.7.1/index.qmd
Comment thread content/blog/shinychat-v0.5.0/index.qmd Outdated
Comment thread content/blog/shinychat-r-0.5.0-python-0.7.1/index.qmd
Comment thread content/blog/shinychat-v0.5.0/index.qmd Outdated
Comment thread content/blog/shinychat-v0.5.0/index.qmd Outdated
Comment thread content/blog/shinychat-r-0.5.0-python-0.7.1/index.qmd
Comment thread content/blog/shinychat-v0.5.0/index.qmd Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Blog YAML Checks

✅ All 1 posts passed.

@github-actions

Copy link
Copy Markdown
Contributor

@gadenbuie
gadenbuie merged commit 4ba3abf into main Sep 13, 2026
13 checks passed
@cpsievert
cpsievert deleted the blog/shinychat-v0.5.0 branch September 14, 2026 21:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants