report
Skill63 starsChanged yesterdayMITView on GitHub
Generative UI. Build the person a view in the chat with the MCP tool report. You write a small React view against log's kit, and log draws it with data from log.db. Plain and readable, in the spirit of Lynx workspaces. Use when the person says "make a report", "show me", "chart of", "dashboard of", "who has been messaging me", "tell me about this person", or would rather see something than read it.
96 other projects use a version of this.
Adopted by
Most recently taken up by
- markmhendrickson/neotomatheir own version, first seen Nov 15, 2026
- automagik-si/genietheir own version, first seen Nov 15, 2026
- BermanRoman/promt-seo-geotheir own version, first seen Nov 8, 2026
- eliasjnior/claude-skillstheir own version, first seen Nov 8, 2026
- ai-search-guru/getcito-worlds-first-open-source-aio-aeo-or-geo-tooltheir own version, first seen Nov 8, 2026
- leinardi/adversarial-review-looptheir own version, first seen Nov 8, 2026
Used with
Projects with it also use opportunities, export and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
ansvisorSkillopportunities
Finds content gaps, prompts worth tracking, and the off-site sources AI cites instead of the brand.
Also in 3 projects that use this
soilmassSkillexport
Animation export configurations including format selection, resolution, framerate, quality, and optimization settings. Use when rendering animations for web, mobile, video, or social media. Provides tokens for all export parameters across Lottie, GIF, video, and sprite sheet formats.
Also in 4 projects that use this
GoogleSkillquality
Evaluates whether a GitHub issue is spam, empty, needs more information, or is OK to proceed.
Also in 3 projects that use this
genomewalkerSkillresume
Resume a thread by loading its ~800-token context capsule
Also in 7 projects that use this
tokyubevoxelverseSkillcheckup
Give a repository a full health exam — doc rot, dependency staleness, CI decay, git hygiene, dead links, docs contradicting code — and grade it. Use when the user wants to know what quietly rotted, or a prioritized maintenance list.
Also in 3 projects that use this
rajnavakotiSkillscan
Run the AI dashboard scanner and generate the HTML report.
Also in 5 projects that use this
Other versions96 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 96
- microsoft/data-formulator★ 17ksame name
- Zafer-Liu/Data-Analysis-Agent★ 2.6ksame name
- H-mmer/pentest-agents★ 815same name
- ai-search-guru/getcito-worlds-first-open-source-aio-aeo-or-geo-tool★ 432same name
- cwinvestments/memstack★ 425same name
- automagik-si/genie★ 353same name
- automagik-dev/genie★ 351same name
- namastexlabs/automagik-genie★ 351same name
- ansvisor/ansvisor★ 233same name
- andrew-yangy/gru-ai★ 153same name
86 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository82 other files it gives its agents.
- AGENTS.mdAGENTS.md
- log-discord-channel-replySkill
- log-discord-forum-postsSkill
- log-discord-group-chat-readSkill
- log-discord-meme-replySkill
- log-discord-server-replySkill
- log-discord-server-searchSkill
- log-facebook-groupsSkill
- log-facebook-marketplace-listingsSkill
- log-inbox-boss-maxxingSkill
- log-inbox-governor-resetSkill
- log-inbox-reactionsSkill
- log-inbox-rea-looksmaxxingSkill
- log-inbox-scope-ajobSkill
- log-inbox-show-meSkill
- log-inbox-sign-inSkill
- log-inbox-triageSkill
- log-inbox-voice-noteSkill
- log-instagram-dm-replySkill
- log-instagram-new-platformSkill
- log-linkedin-networkSkill
- log-linkedin-postsSkill
- log-reddit-contributor-maxxingSkill
- log-slack-dm-replySkill
- log-twitter-affiliate-marketingSkill
- log-twitter-collab-maxxingSkill
- log-twitter-dm-inboxSkill
- log-twitter-engagement-repliesSkill
- log-twitter-engager-dmsSkill
- log-twitter-followersSkill
- log-twitter-follow-upsSkill
- log-twitter-get-the-actionSkill
- log-twitter-manager-maxxingSkill
- log-twitter-network-maxingSkill
- log-twitter-niche-map-regionSkill
- log-twitter-notificationsSkill
- log-twitter-recruitingSkill
- log-twitter-reply-guy-funnelSkill
- log-twitter-topic-repliesSkill
- log-twitter-who-needs-youSkill
- log-web-competitor-trafficSkill
- accountToDryRunSkill
- adsPowerSkill
- agentHooksSkill
- callTimingSkill
- captureRuleSkill
- commitLogSkill
- consoleSkill
- conversationsSkill
- devlogMaxxingSkill
- discordServersSkill
- facebookFlowsSkill
- facebookInspectSkill
- facebookWarmupSkill
- flowSkill
- governorSkill
- hostSkill
- humanMouseSkill
- inspectSkill
- instagramSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
2 rules. 0 are common, 1 is distinctive, and 1 is very specific to this project.
0
Common
Most of the 71 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 73
Imports: only from "log" and "react", at the top.
- Distinctive: line 99
Only call read tools.
“Common” is measured: kept by at least 6 in 10 of the 71 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
report
report is log's generative UI. You decide what the person should see and write it as a small React view. log compiles it and draws it in the chat, with the data read from log.db in the same call.
- Where it draws: an MCP Apps host (Claude, ChatGPT, Cursor) draws the view inline. Other hosts (Claude Code, Codex) get the same view rendered as text, which you show as it is.
- Why it looks the way it does: the kit follows Lynx's workspace kit (MIT): a quiet canvas, plain blocks, big light numbers, and Geist. It gives a general starting point that informs; the content is what makes it good.
One call, no code
{ "title": "Who's been messaging you on X", "subtitle": "last 30 days", "data": { "dms": { "source": "twitterDmsBySender", "since": "30d" } } }This draws the starter view, which shows:
- headline stats, each with a line of what it means (top 10 share, new this week, busiest day)
- messages per day
- who messages most
- a table of people with their 30-day activity, when they last wrote and what they said
log.db holds only what has been read. If the inbox may be behind, read it with twitterDms first (rule 160).
The data sources
Each entry in data names one source. Every source reads log.db only, with no platform call.
source | Inputs | What it hands the view |
twitterDmsBySender | account?, since?, limit? | Who messaged the X account in one-to-one DMs: people, counts, activity, latest message |
dmsBySender | platform, account?, since?, limit? | The same, for any platform with chats in log.db. A platform with none is refused with reportSourceNoData |
identityProfile | platform, and userId or handle | One person: name, handle, bio, follower count, verified, extra (location, following, posts, premium and so on) and the avatar as a data URI. Drawn as a person card with no code. A person with no stored profile is refused with identityProfileMissing |
{ "title": "Who is this", "data": { "person": { "source": "identityProfile", "platform": "twitter", "handle": "fakeBird" } } }Profiles are kept when a session check or twitterFollowers sees them; nothing fetches a profile just to draw it.
Your own view
Send code with the same data, and shape the view to the question. A question about one person gets that person; a question about the week gets the week. Start from what would help the person decide or act, and keep it short.
import { Page, Card, Grid, Stat, Bars, Quote, Avatar, Row, Stack, Badge, Time, fmt } from "log";
export default function App({ data, title, subtitle }) {
const r = data.dms;
const p = r.senders[0];
return (
<Page title={title} subtitle={subtitle}>
<Card>
<Row gap={14}>
<Avatar name={p.name} size={48} />
<Stack gap={2} style={{ flex: 1 }}><strong>{p.name}</strong><span className="sb-stat-hint">@{p.handle}</span></Stack>
<Badge tone="accent">{Math.round((p.count / r.messages) * 100)}% of your DMs</Badge>
</Row>
</Card>
<Grid min={150}>
<Stat label="Messages" value={fmt(p.count)} hint={`rank 1 of ${r.people}`} />
<Stat label="Last message" value={<Time value={p.lastAt} />} />
</Grid>
<Card title="Latest message"><Quote>{p.lastMessage}</Quote></Card>
<Card title="How they compare"><Bars data={r.senders.slice(0, 5).map((s) => ({ label: s.name, value: s.count }))} unit="msgs" /></Card>
</Page>
);
}- Imports: only from
"log"and"react", at the top.import()is refused withviewImportRefused. End withexport default function App({ data, title, subtitle }). - Layout:
Page { title, subtitle, actions }Card { title, actions, pad }; usepad={false}around aTableGrid { min }RowandStack, each{ gap }
- Numbers:
Stat { label, value, hint, tone }Badge { tone: neutral|good|bad|warn|accent }fmt(n)formats a number, andTime { value }shows how long ago
- Charts:
Bars { data: [{ label, value }], unit }for ranked listsBarChartfor columns over timeLineChart { series: [{ name, values }], labels }Sparkline { values, width }
- People and words:
Avatar { name, size, src },srcadata:image/URI such as a profile'savatarQuoteIcon { name }, with Font Awesome 6 names in camelCase (xTwitter,discord,message,users,clock)
- Detail:
Table { rows, columns: [{ key, title, render, align, width }], limit }Tabs,Details,Empty
- Your own CSS: plain CSS works. Use the
--sb-*variables (--sb-text,--sb-muted,--sb-accent,--sb-surface), which follow light and dark mode. - Live data:
useTool(name, args)calls a log read tool from inside the view and returns{ data, loading, error, reload }.- Wrap it in
<Query q={…}>{(data) => …}</Query>. - Only call read tools.
- Interaction, from Lynx:
- Pages:
RouteswithLinkandBackLink(useRoutegives the path), so a table can open a page per person. - Asking:
AskButton { prompt }andFollowUps { prompts }put a question into the chat, andaskAgent(text)does it from code. End an overview with 2 or 3 follow-ups. - Pointing:
Pointable { about }andtellAgent(text)tell the agent what the person is looking at without sending a message. - Forms:
Button,Input,Select,Textarea,Field,ModalanduseAction(fn). - Also
Markdown,FullscreenButton,downloadCsv(name, rows)andopenExternal(url).ErrorNoteoffers "Ask the agent to fix it". - A view never sends anything itself: an ask goes through the chat, where every send gate still applies.
- Pages:
A view that doesn't compile, imports from anywhere else, or breaks while drawing is refused with reportFieldInvalid, with the line or error to fix.
The older blocks list (heading, text, stat, barChart, lineChart, table, personList, callout) still works and is drawn with the same kit.
After it is drawn
In an MCP Apps host the person already sees the view, so say what it means in a sentence or two, not the numbers again.
How it is built
- Code:
src/mcp/apps/report/viewholds:- the kit (
kit.tsx,kit.css) - the widget that runs the view in the chat (
widget.tsx) - the server side that compiles with sucrase and renders the text version (
server.tsx) - the starter views (
starters/)
- the kit (
- Data: the sources are one registry,
REPORT_SOURCESinsrc/mcp/apps/report/helpers/sources.ts. A new source is one entry there: its input schema, its reader, its starter and its text. - What the page loads: the page is self-contained, with React, the kit and Geist inlined, so it loads nothing from the internet.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

