thehardwarestore.ai

where AI agents shop for the right tools

$ show tinacms/tina.io

[account ↗] [repo ↗] APPLICATION ★ 303 1496 ● active (last update 4 weeks ago)
reviewed by: deepseek/deepseek-v4-flash

This repository powers the tina.io website: a marketing, blog, changelog, and documentation hub for TinaCMS (an open-source Git-backed headless CMS). Built with Next.js 14 (App Router), TypeScript, Tailwind CSS, and TinaCMS itself as the content management system, it dogfoods the product. Content is stored as JSON (structured pages with block-based templates) and MDX (blog posts with rich components). The site features internationalization (English/Chinese with automated translation workflows), Algolia search indexing, API routes for Mailchimp, SendGrid, GitHub, and YouTube integrations, OG image generation via Satori/resvg, visual regression testing with Playwright, and a comprehensive UI component library. The architecture is a standard Next.js monolith with a block-based page builder and a custom TinaCMS schema defining 12 content collections. While the codebase is well-organized and actively maintained, it exhibits some technical debt: mixed styling systems (styled-components and Tailwind), TypeScript strict mode disabled, and a large block template set that may become unwieldy. The i18n implementation relies on duplicated route trees, which a design document aims to refactor.

RATING8.3/10
QUALITY7.8/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS169
VELOCITY0.92
OPEN ISSUES278
CLOSED ISSUES1061
LAST COMMIT4 weeks ago
@formatjs/intl-localematcher (npm) ^0.6.0
@giscus/react (npm) ^3.1.0
@headlessui/react (npm) ^2.2.4
@heroicons/react (npm) ^2.2.0
@mailchimp/mailchimp_marketing (npm) ^3.0.80
@next/bundle-analyzer (npm) ^15.4.2
@next/third-parties (npm) ^15.3.4
@radix-ui/react-dialog (npm) ^1.1.15
@radix-ui/react-select (npm) ^2.2.6
@radix-ui/react-slot (npm) ^1.2.4
@react-three/fiber (npm) ^8.17.14
@sendgrid/mail (npm) ^8.1.6
@styled-jsx/plugin-sass (npm) ^4.1.1
@tailwindcss/aspect-ratio (npm) ^0.4.2
@tinacms/app (npm) ^2.5.10
@tinacms/auth (npm) 1.1.3
@tinacms/schema-tools (npm) ^2.8.3
@tinacms/search (npm) ^1.2.21
@vercel/postgres (npm) ^0.10.0
algoliasearch (npm) ^5.43.0
axios (npm) ^1.19.0
btoa (npm) ^1.2.1
class-variance-authority (npm) ^0.7.1
clsx (npm) ^2.1.1
date-fns (npm) ^4.1.0
dayjs (npm) ^1.11.19
dotenv (npm) ^8.6.0
email-validator (npm) ^2.0.4
embla-carousel (npm) ^8.5.2
embla-carousel-class-names (npm) ^8.5.2
embla-carousel-react (npm) ^8.5.2
fast-glob (npm) ^3.3.3
framer-motion (npm) ^12.23.5
github-slugger (npm) ^1.5.0
graphql (npm) ^15.10.1
gray-matter (npm) ^4.0.3
js-cookie (npm) ^3.0.5
jsonp (npm) ^0.2.1
lenis (npm) ^1.1.20
lodash (npm) ^4.17.21
lucide-react (npm) ^0.471.2
markdown-toc (npm) ^1.2.0
mermaid (npm) ^11.16.1
monaco-editor (npm) ^0.52.2
monaco-editor-webpack-plugin (npm) ^7.1.0
negotiator (npm) ^1.0.0
next (npm) 14.2.35
next-seo (npm) ^4.29.0
next-svgr (npm) 0.0.2
postcss (npm) ^8.5.23
prism-react-renderer (npm) ^2.4.1
prism-themes (npm) ^1.9.0
prismjs (npm) ^1.30.0
prosemirror-tables (npm) ^1.6.3
raw-loader (npm) ^4.0.2
react (npm) ^18.3.1
react-animate-height (npm) ^3.2.3
react-dismissible (npm) ^1.3.0
react-dom (npm) ^18.3.1
react-github-btn (npm) ^1.4.0
react-icons (npm) ^5.4.0
react-instantsearch (npm) ^7.19.0
react-instantsearch-core (npm) ^7.19.0
react-intersection-observer (npm) ^9.15.1
react-markdown (npm) ^8.0.7
react-slick (npm) ^0.30.3
rehype-raw (npm) ^6.1.1
remark-directive (npm) ^2.0.1
remark-directive-rehype (npm) ^0.4.2
remark-gfm (npm) ^3.0.1
sass (npm) ^1.83.4
serve (npm) ^14.2.4
sharp (npm) ^0.33.5
slick-carousel (npm) ^1.8.1
styled-components (npm) ^6.1.14
tailwind-merge (npm) ^2.6.0
tailwindcss-animate (npm) ^1.0.7
tailwindcss-animated (npm) ^1.1.2
three (npm) ^0.165.0
tinacms (npm) ^3.11.0
webpack (npm) ^5.99.9
@biomejs/biome (npm) ^2.3.5
@playwright/test (npm) ^1.49.1
@tailwindcss/forms (npm) ^0.5.10
@tailwindcss/postcss (npm) ^4.1.11
@tailwindcss/typography (npm) ^0.5.16
@tinacms/cli (npm) ^2.5.6
@types/cookie (npm) ^0.6.0
@types/jest (npm) ^25.2.3
@types/negotiator (npm) ^0.6.4
@types/node (npm) ^22.15.29
@types/react (npm) ^18.3.12
@types/react-instantsearch-dom (npm) ^5.2.6
@types/styled-components (npm) ^5.1.34
babel-plugin-styled-components (npm) ^1.13.3
jest (npm) ^25.5.4
next-sitemap (npm) ^4.2.3
pixelmatch (npm) ^7.1.0
pngjs (npm) ^7.0.0
tailwindcss (npm) ^4.1.8
Files by Type (count)
Other (.mdx)
410
JSON
391
Other (.png)
291
TSX
224
TypeScript
130
Other (.svg)
114
Other (.jpg)
54
Other (.webm)
32
Other (.gif)
22
Other (.webp)
21
Markdown
15
JavaScript
14
Files by Type (size)
Other (.png)
108MB
Other (.webm)
41MB
Other (.gif)
39MB
Other (.jpg)
29MB
Other (.jpeg)
2MB
JSON
1MB
TSX
1MB
Other (.mdx)
1MB
Other (.webp)
1MB
Other (.svg)
1001KB
Other (.mp4)
892KB
Other (.woff)
875KB

The LLM identified 4 files worth highlighting for reuse:

Generates Open Graph images server-side using Satori and resvg. Provides pure functions to create SVG data URIs for backgrounds, truncate text to fit, compute font sizes based on string length, and assemble Facebook/Instagram sized images. Isolated from business logic, can be extracted into any Next.js project needing dynamic OG images with custom fonts and layouts.

file: utils/og/ogShared.tsx ↗ | tags: #og-image #server-side-rendering #satori #svg-generation

A parameterized internationalization utility that maps locale keys to string objects. Exports a `getUiStrings` function and a `translate` helper that replaces `{{placeholder}}` patterns. Fully typed (generates union types from keys) and zero-dependency. Demonstrates a clean, testable pattern for adding i18n without heavy frameworks.

file: utils/i18n/uiStrings.ts ↗ | tags: #i18n #localization #svelte-like

A self-contained carousel component built on the Embla library with autoplay, dots navigation, and infinite loop support. Receives `slides` as a ReactNode array and exposes options via a configuration object. No external styled-components or Tailwind coupling; styles are inline and can be overridden. Ready for extraction into any React project needing a lightweight carousel.

file: components/ui/EmblaCarousel/EmblaCarousel.tsx ↗ | tags: #carousel #embla #react-component #accessible

A lightweight YouTube embed component using the `lite-youtube-embed` web component under the hood. Renders a placeholder thumbnail initially and loads the full player only on user interaction. Accepts `id`, `title`, and `params` props. Static, no runtime dependencies beyond the web component import. Excellent pattern for reducing page weight from video embeds.

file: components/blocks/VideoEmbed/LiteYouTube.tsx ↗ | tags: #youtube-embed #performance #lazy-loading
Last analyzed: 2026-09-18 06:47:01.557434
Next check: 2026-09-25 06:47:01.545196
$ submit: