Navigation Menu
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Comparing changes
Open a pull request
base repository: simstudioai/sim
base: main
head repository: simstudioai/sim
compare: feat/credit-usage-log
- 13 commits
- 100 files changed
- 3 contributors
Commits on Jul 3, 2026
-
improvement(academy): set 2, pages for the new video wave (workflow e…
…mbeds, 2K players, full sequencing) (#5382) * academy: Chat section (intro, building) + Agents tool-calling and skills pages, sequenced in meta.json — pages for the four approved videos, blob src pattern, chapters offset by each recorded intro * academy pages: Related documentation links point at real docs routes (mothership/agents/logs-debugging/deployment), not other academy videos * academy: Tables — Workflow Columns page (combined-cut chapters, receipts pedagogy), sequenced after tables/intro * academy set 2: five new pages (agents/block, agents/memory, knowledge-bases/connectors, tables/operations, files/object) + retimed chapters on the redone tables/files intros (recomposed/working-day cuts) + full meta.json sequencing — Chat · Agents(5) · Tables(3) · Files(2) · KB(2) * academy pages: every page shows the VIDEO's workflow (new academy-video-workflows.ts registry — invoice intake, Qualify, memory, table ops, tools/skills agents, support-desk, content-agent) + plain pedagogical headings throughout (no poetry: 'The warm and cold split' → 'The same agent, with and without memory', 'From one pass to a loop' → 'What tools change', etc.); files/intro's embed swapped to the video's machine * academy: all video players point at the 2K blob set (academy/<slug>.mp4) — 20 pages rewritten from academy-preview/*-light-with-intro, files/intro plays the new files-intro cut, workflows/logs gains its src (video now exists); use-case placeholders stay src-less (no videos yet) * biome: format academy-video-workflows.ts * fix (cursor/greptile): support-desk condition block uses branches + rows:[] (the renderer's real fields — conditions: was never read, so Urgent? rendered without if/else handles and branch edges dangled); bgColor aligned to the product condition example * biome: format meta.json (CI lint:check) * fix (cursor): Start exposes <start.input>, not <start.ticket>/<start.idea> — support-desk Triage and content-agent Writer message rows now match the product's Start output (same pattern as the file's other workflows) * academy lesson material (CTO ask): FAQ on every lesson page + the index (grounded in the audited codebase facts: memory modes, the ten table ops, coerce/refuse, deploy surfaces + draft-vs-deployed, file parser formats; the FAQ component emits FAQPage JSON-LD for SEO); em-dashes 202 → 0 with hand-fixed splices; added copy where sparse (agent block placement, when-to-use-memory); SEO phrasing sprinkled naturally into FAQ answers ('visual platform for building AI workflows and agents', 'no-code', model names), not over-indexed * fix: quote frontmatter descriptions that gained colons in the em-dash pass (unquoted YAML scalars with a second colon broke every page)
Configuration menu - View commit details
-
Copy full SHA for 3e71084 - Browse repository at this point
Copy the full SHA 3e71084View commit details -
feat(comparison): add Sim vs Competitor comparison pages (#5383)
* feat(comparison): add Sim vs Competitor comparison pages - New /comparison hub + /comparison/[provider] detail pages for Sim vs 16 competitors (n8n, Zapier, Make, Gumloop, Workato, Retool, Pipedream, OpenAI AgentKit, Tines, StackAI, Power Automate, Vellum, Claude Cowork, Langflow, Flowise), each with ~60 sourced, dated facts across platform, AI capabilities, integrations, pricing, security, observability, and support - Data layer at lib/compare/data (types, per-competitor profiles) is UI-free and independently auditable - BreadcrumbList, ItemList, and FAQPage JSON-LD per page; sitemap picks up all pages automatically via ALL_COMPETITORS - Two new fact categories (parallel execution, Agent2Agent protocol) researched and sourced against every competitor's own docs * improvement(comparison): neutralize tone across competitor and Sim fact copy - Remove promotional/superlative adjectives applied to competitors (Zapier "one of the largest catalogs", Workato "notably wide", Retool "seamless"/"trusted solution", OpenAI "cutting-edge", Flowise "deep"/"mature"/"most widely adopted", Make "robust") - Reword the few places Sim's own accurate limitations read as unflattering rather than neutral fact (dynamic tool use, model fallback, durability, async execution, support channels, tracing) without changing the underlying facts - Restore the "Yes:"/"No:" value prefix on two Sim facts where it was accidentally dropped during rewording, since FactValue depends on that prefix to render the check/X status icon * fix(comparison): address review findings from Greptile and Cursor Bugbot - Fix parseFactValue regex to require a word boundary after Yes/No, so values like "Not documented"/"Not publicly documented" no longer get misread as a boolean "No" and render as neutral text again (Cursor) - Reword the self-hosting FAQ question to drop the false presupposition that the competitor doesn't self-host, which was wrong for n8n, Langflow, and Flowise (Greptile) - Rename isLastRow -> isNotLastRow in comparison-table.tsx to match what the variable actually computes (Greptile) - Move critters to devDependencies; it's a next build -time-only CSS inliner, not needed at runtime (Greptile) - Sitemap lastModified for comparison pages now matches the max(Sim, competitor) verified-date logic each page's own JSON-LD dateModified already uses, so the two never disagree (Cursor) * fix(comparison): fix doubled Yes prefix and missing period in hub FAQ - Two hub FAQ answers prepended "Yes." to fact values that already start with "Yes:", producing "Yes. Yes: ..." in visible copy and FAQPage JSON-LD. Export and reuse ensurePeriod instead of a hardcoded prefix. - The integrations-count FAQ answer ran two sentences together with no period before "Combined with...". Fixed with the same ensurePeriod helper. * improvement(comparison): remove redundant Key differences at a glance section The 5 facts it previewed (self-hosting, environment promotion, human-in-the-loop, pricing model, data residency) are the exact same rows shown again immediately below in the full comparison table, so the section read as pure repetition for a human scrolling past it. * fix(comparison): strip Yes/No prefix before lowercasing in summarizeFact summarizeFact fed the raw fact value through lowercaseFirst even when it started with "Yes: "/"No: ", producing broken mid-sentence FAQ text like "n8n: yes: many providers via dedicated Chat Model nodes." Strip the boolean prefix first, matching Greptile's suggested fix.
Configuration menu - View commit details
-
Copy full SHA for 4086750 - Browse repository at this point
Copy the full SHA 4086750View commit details -
improvement(tables): harden pagination for short pages and surface na…
…me-validation errors (#5351) * improvement(tables): harden pagination for short pages and surface name-validation errors * fix(tables): align getNextPageParam tests with count-based termination * improvement(tables): lift the 10K-char per-string-cell limit
Configuration menu - View commit details
-
Copy full SHA for de110e0 - Browse repository at this point
Copy the full SHA de110e0View commit details -
feat(comparison): add Microsoft Copilot Studio, OpenClaw, Dust, CrewA…
…I, and LangChain (#5384) * feat(comparison): add Microsoft Copilot Studio, OpenClaw, Dust, CrewAI, and LangChain - 5 new "Sim vs Competitor" profiles (now 20 total), each with ~58 independently sourced facts, standout features, and limitations, researched against each vendor's own docs/pricing/GitHub - New brand icons: MicrosoftCopilotIcon, OpenClawIcon, DustIcon, LangChainIcon, CrewAIIcon - isWorkflowBuilder: false for OpenClaw, CrewAI, and LangChain since they're a personal agent runtime and code-first frameworks rather than visual workflow builders, so their FAQ asks a category-clarifying question instead of a peer feature-gap one - Independent tone audit (no over-praising competitors, no unflattering Sim framing) and a fresh accuracy re-verification pass (50 highest- stakes facts across all 5 profiles, all confirmed against live sources) both came back clean * fix(comparison): fix two more FAQ text-mangling bugs found during final audit - lowercaseFirst only guarded against 2+ CONSECUTIVE leading capitals (acronyms like "AI"/"SSO"), so CamelCase brand names with a single leading capital (LangChain, OpenClaw, CrewAI) got their first letter wrongly lowercased ("langChain provides..."). Now checks for 2+ uppercase letters anywhere in the leading word, which covers both acronyms and CamelCase brand names. - parseFactValue and summarizeFact's boolean-prefix stripping only recognized "Yes:"/"No:" (colon), but "Yes, ..."/"No, ..." (comma) is an equally common phrasing already used across ~15 existing facts (stackai, pipedream, workato, zapier, etc.), so those facts kept their leading comma when stitched into an FAQ answer (e.g. "StackAI: , broad support..."). Both now accept either separator. Found by systematically sweeping every "Sim vs X" FAQ answer across all 20 competitor pages for garbled/mis-cased text, not just the 5 newly added ones. * feat(comparison): add sub-workflow composition and loop-block facts - Two new universal comparison facts across all 20 profiles: subWorkflows (calling a saved workflow as a reusable step inside another) and loopIteration (a dedicated sequential for-each/while loop container, distinct from concurrent Parallel execution) - Both are real Sim capabilities (Workflow block, Loop block) verified directly against the codebase and docs.sim.ai - Findings are genuinely mixed, not uniformly favorable: n8n, Zapier, Make, Workato, Retool, Power Automate, Gumloop, Vellum, Stack AI, Tines, Langflow, Flowise, Microsoft Copilot Studio, and LangChain all have some form of sub-workflow calling; Zapier and Gumloop's loop primitives run concurrently rather than sequentially (marked "Partial", not "No"); Pipedream, OpenAI AgentKit, Claude Cowork, CrewAI, Dust, and OpenClaw genuinely lack one or both * feat(comparison): add third-party integration vetting fact New universal comparison fact across all 20 profiles: thirdPartyVetting, whether a platform's integrations/tools/skills come from a vetted first-party catalog vs. an open marketplace where any third party can publish executable code with lighter or no vendor security review. Directly relevant given OpenClaw's ClawHub marketplace has documented incidents (283 skills, ~7.1% of the registry, found leaking credentials; 24 accounts distributing 600+ malicious skills before scanning existed). Findings are honest and mixed, not uniformly favorable: Gumloop, Retool, and Tines are first-party-only like Sim (marked "Yes"); n8n, Zapier, Make, Workato, and OpenAI AgentKit have partial vetting on an open or semi-open ecosystem; Pipedream and OpenClaw are open marketplaces with documented security incidents. * fix(comparison): correct n8n supply-chain attack download count Independently re-verified the cited Hacker News article: the primary malicious package had 4,241 downloads listed (not "3,400 weekly" as previously written, a number not actually supported by the source). * fix(comparison): fix duplicated competitor name in first FAQ answer Every competitor's oneLiner is already a complete "{Name} is ..." sentence, so prepending "${name} is " before it was always redundant. Before this session's lowercaseFirst fix, the duplication rendered in mixed case ("Zapier is zapier is a cloud-based...") and was easy to miss; the CamelCase-name fix made it fully literal and obvious ("CrewAI is CrewAI is..."), which is what Cursor Bugbot caught. Fixed by using the oneLiner directly (via ensurePeriod) instead of re-prepending the name. Verified fixed across all 20 pages via live curl, not just the CrewAI case Cursor flagged. * improvement(comparison): cite Sim's own docs alongside code for 4 facts Added docs.sim.ai citations (Roles and Permissions, BYOK, Debugging retrieval, Function block) as primary sources for rbac, byok, kbChunkVisibility, and customCodeSteps, which previously cited only GitHub source code with no user-facing documentation reference. Verified all 4 doc URLs resolve (200).
Configuration menu - View commit details
-
Copy full SHA for 0cc290e - Browse repository at this point
Copy the full SHA 0cc290eView commit details -
fix(billing): stop showing "View all" when there are no more invoices (…
…#5387) * fix(billing): stop showing "View all" when there are no more invoices Show fewer invoices (10) and derive hasMore from the finalized-invoice count instead of Stripe's raw has_more, which counted drafts we filter out client-side and could report more invoices than actually exist. * chore(billing): move invoice pagination explanation into TSDoc Extract collectFinalizedInvoices with a TSDoc comment explaining the Stripe has_more/draft-filtering rationale, instead of an inline comment block. * fix(billing): don't hide View all when the page-cap is hit inconclusively Greptile P1: if MAX_STRIPE_PAGES is exhausted while the finalized count sits exactly at MAX_INVOICES and Stripe still has_more, hasMore was silently returned as false. collectFinalizedInvoices now also returns whether Stripe's cursor was still open at exit, and the route ORs that into hasMore so the safety cap can never suppress "View all". Also asserts starting_after cursor propagation across pages and adds a test for the safety-cap-hit case.
Configuration menu - View commit details
-
Copy full SHA for 331875b - Browse repository at this point
Copy the full SHA 331875bView commit details -
fix(sso): support skipping the OIDC UserInfo endpoint at registration (…
…#5386) * fix(sso): support skipping the OIDC UserInfo endpoint at registration * fix(sso): cap OIDC discovery fetch at 10s to avoid stalling registration * test(sso): default-mock discovery fetch so intent is explicit * fix(sso): prefer client_secret_post and surface discovery failure reasons * fix(sso): always resolve token auth method and skip SSRF-checking a discarded userInfoEndpoint
Configuration menu - View commit details
-
Copy full SHA for e1b8200 - Browse repository at this point
Copy the full SHA e1b8200View commit details -
feat(billing): expose credit usage log in Billing settings
Add a "Credit usage" section under Billing, below Invoices, showing a paginated, period-filterable list of individual credit-consuming events (model, tool, and fixed charges) for every plan except Enterprise. Wires the existing (previously unused) usage-logs backend to a proper contract, React Query hook, and emcn-styled UI: - getUsageLogsContract in contracts/user.ts, broadened the source enum to match the real usage_log schema - Rewrote the route to use parseRequest per the API boundary rules - useUsageLogs infinite-query hook, keyset-paginated - CreditUsageSection: period dropdown, total-credits summary, row list with source badges, "Load more" - Extracted formatCreditsLabel in conversion.ts as the shared formatter for already-converted integer credits
Configuration menu - View commit details
-
Copy full SHA for a9b649d - Browse repository at this point
Copy the full SHA a9b649dView commit details -
fix(billing): move usage-log key factory out of the 'use client' boun…
…dary Greptile P2: usageLogKeys lived in the 'use client' usage-logs.ts hook file — importing it from a server component (e.g. a future prefetch) would resolve to a client-reference stub and crash at build/SSR, the same class of bug that hit tables' key factory before. Extracted to hooks/queries/utils/usage-log-keys.ts, matching table-keys.ts and folder-keys.ts. Also renamed a shadowed `source` map param in the route to `sourceKey` for clarity.
Configuration menu - View commit details
-
Copy full SHA for 89fe7e7 - Browse repository at this point
Copy the full SHA 89fe7e7View commit details -
chore(billing): dedupe the usage-log period literal type
The '1d' | '7d' | '30d' | 'all' union was hand-typed in three places across usage-logs.ts and credit-usage-section.tsx. Extracted usageLogPeriodSchema in the contract and derived UsageLogPeriod from it, so the hook, the component, and the key factory all share one definition instead of risking drift.
Configuration menu - View commit details
-
Copy full SHA for 9d6dd83 - Browse repository at this point
Copy the full SHA 9d6dd83View commit details -
improvement(billing): move credit usage period filter into the URL
/cleanup pass (nuqs rule, react-query-best-practices, emcn review): - period was a plain useState, but it's exactly the kind of shareable list filter sim-url-state.md calls out for nuqs — migrated to billingParsers/useQueryStates so the selection deep-links, survives reload, and matches every sibling settings section (recently-deleted, inbox, teammates). Derives its literal values from usageLogPeriodSchema instead of a fourth copy of the same union. - Removed an unjustified showSelectedCheck={false} on the period ChipDropdown — the one other usage in the codebase is a one-shot action menu with no persistent selection; this is a real filter and should show the check like the default intends. - Added placeholderData: keepPreviousData to useUsageLogs — period is a variable query key, so without it switching periods flashed the loading empty-state instead of smoothly transitioning. Verified live: deep-link with ?period=7d pre-selects and loads correctly, switching periods updates the URL, and the selection survives a hard reload.Configuration menu - View commit details
-
Copy full SHA for 73679b1 - Browse repository at this point
Copy the full SHA 73679b1View commit details -
fix(billing): apportion per-row credit costs so they sum to the page …
…total Cursor Bugbot (medium): each row rounded its own dollar cost to credits independently while the header total rounded the summed dollars once — over enough rows those two roundings can visibly disagree, the exact "line items don't add up to the total" class of bug apportionCredits was already built to prevent (used by the trace view / cost breakdown). Route now apportions each page's row credits against that page's dollar sum instead of rounding rows independently. Added a test with three sub-cent rows that would each independently round to 0 credits (but sum to 1) to prove the reconciliation holds.
Configuration menu - View commit details
-
Copy full SHA for 10648f1 - Browse repository at this point
Copy the full SHA 10648f1View commit details -
fix(billing): dim stale credit usage rows while a new period loads
Cursor Bugbot (medium): keepPreviousData kept the prior period's rows and total on screen while a newly selected period fetched, but the dropdown label updated immediately — so during the transition the displayed numbers were labeled under a period they didn't belong to. Now reads isPlaceholderData (the standard TanStack Query signal for "this data is a stale placeholder, not a fresh fetch for the current key") and dims the list while it's true, matching the same flag already used for this exact purpose in integration-skills-section.tsx.
Configuration menu - View commit details
-
Copy full SHA for a59fd7d - Browse repository at this point
Copy the full SHA a59fd7dView commit details -
fix(billing): show "<1 credit" for rows apportioned to 0
Cursor Bugbot (low): with apportioned per-row credits, a row with a real but sub-credit dollarCost can legitimately apportion to 0 credits once a sibling row absorbs the shared rounding remainder — rendering a flat "0 credits" reads as if nothing was charged, inconsistent with formatCreditCost's "<1 credit" wording used elsewhere in billing. Added dollarCost to the wire response (needed to distinguish a genuinely free row from a rounded-to-zero one) and a small formatRowCredits helper that only changes the label, not the underlying creditCost number, so the page-total reconciliation from the prior fix is unaffected.
Configuration menu - View commit details
-
Copy full SHA for 40a319d - Browse repository at this point
Copy the full SHA 40a319dView commit details
This comparison is taking too long to generate.
Unfortunately it looks like we can’t render this comparison for you right now. It might be too big, or there might be something weird with your repository.
You can try running this command locally to see the comparison on your machine:
git diff main...feat/credit-usage-log
