New Comark plugin: comark-carousel
Every block inside ::carousel becomes a slide: images, code, prose. Slides scroll and snap with no JavaScript. The script adds arrows, dots and arrow keys, and a click zooms the slide.
comark.onmax.me/carousel/
New Comark plugin: comark-zoom
Click an image to zoom it. Wrap a table or code block in ::zoom and it zooms too. Give a few the same group and they open as one gallery you can page with arrow keys.
Escape, Back or a click outside closes it.
comark.onmax.me/zoom/
I wanted agents to put annotated screenshots in PRs without anyone drawing on them
comark-annotate is a @comarkdown plugin for that. Write the marks in Markdown, get hand-drawn boxes, arrows and before/after pairs as static HTML.
comark-annotate.onmax.me
Use Comark components when the document needs logic:
```md
::if{pullRequest.draft}
This pull request is still a draft.
::else
Review the changed files and report the result.
::
```
ViteHub gets Comark’s component system out of the box:
comark.dev/docs/plugins/if
Comark’s binding syntax lets you put runtime data directly in a `.md` file:
```md
# Review {{ pullRequest.number }}
Title: {{ pullRequest.title }}
The PR was opened by {{ pullRequest.author.name }}.
```
ViteHub passes your Agent or server data into the Comark renderer.
The email is a Markdown template with variables and conditions. Comark renders it for the email driver.
I'll share more about this soon. If you're interested:
vitehub.dev/docs/server-prim…
](https://pbs.twimg.com/media/HR2bXBLW4AcChJK.jpg?name=small&format=webp)
ALT Abbreviated code example. # {{ recap.user.name }}, this was your {{ recap.label }} on GitHub You opened **{{ recap.metrics.openedPullRequests }} pull requests**. ::if{recap.topRepository} You were most active in **{{ recap.topRepository.name }}**. :: [Open and share your visual recap]({{ url }})


















![// server/workflows/monthly-recap/02-store.ts
import { kv } from 'vite-hub/kv'
export default async function (recap: MonthlyRecap) {
const [error] = await kv.set(`monthly-recap:${recap.month}`, recap)
if (error) throw error
return recap
}](https://pbs.twimg.com/media/HR2bXA4XkAEg_4d.jpg?name=small&format=webp)
