astron-rpa

GitHub

Agent-ready RPA suite with out-of-the-box automation tools. Built for individuals and enterprises.

RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy astron-rpa on any server, homelab, or cloud container platform.

CHANGELOG

Changelog

All notable changes to this project will be documented in this file.

[Unreleased]

[0.5.0] - 2026-08-11

Added

- New Project: Dolphin MCP Pilot: Production-grade MCP Server for Apache DolphinScheduler (iflytek/dolphin-mcp-pilot) — 58 tools covering workflow creation, scheduling, instance control, resource management, and raw API passthrough. Category: agent-skills, Language: Python, License: Apache-2.0
- Dolphin MCP Pilot Blog Post: Release announcement blog (dolphin-mcp-pilot-release.md) covering project motivation, technical architecture (MCP protocol, dual auth modes, guided troubleshooting), tool matrix, quick start guide, and real-world usage scenarios (one-line scheduling, automated failure diagnosis, workflow version rollback)
- New Event: Driving Real Hardware with Astron Agent (2026-07-31): Online hackathon exploring how to connect user intent with real devices using Astron Agent — featuring Tuya T5 hardware walkthrough (reading sensor data, conditional logic, screen prompts) with a Mock API path for participants without dev boards
- Bilingual Event Descriptions: Added descriptionEn field to the Event interface and English descriptions for all 12 events. Events page (events.astro) and search index (search-index.json.ts) now switch between Chinese and English descriptions via the existing data-lang-zh / data-lang-en language toggle

Fixed

- Security: 5 Dependency Vulnerabilities Resolved (4 high, 1 moderate): npm audit reduced from 5 to 0 — fixed brace-expansion DoS via unbounded intermediate arrays (GHSA-rgw5-rvv9-x895), fast-uri host confusion via backslash authority (GHSA-7p8r-x3mc-p8w7), nanoid infinite loop with zero-size custom generators (GHSA-2v37-7h3g-55p8), postcss sourceMappingURL arbitrary file read (GHSA-fxqj-rqcc-2cmp), undici response desync / info disclosure / CRLF injection / cookie injection (GHSA-8xcm-r25x-g524, GHSA-4cwx-7wf7-3272, GHSA-m8rv-5g2x-5cg5, GHSA-jr45-8vmc-qm54, GHSA-v3r7-h72x-cjcm)
- Security: 10 Dependency Vulnerabilities Resolved (1 critical, 6 high, 3 moderate): npm audit reduced from 10 vulnerabilities to 0 — fixed tar PAX numeric path type confusion (critical), astro reflected XSS via unescaped View Transition animation properties / spread attribute names / transition:* directive values (GHSA-4g3v-8h47-v7g6, GHSA-f48w-9m4c-m7f5, GHSA-7pw4-f3q4-r2p2), sharp inherited libvips CVE-2026-33327 / CVE-2026-33328 / CVE-2026-35590 / CVE-2026-35591, svgo removeScripts executable script bypass + DOCTYPE Billion Laughs DoS (GHSA-2p49-hgcm-8545, GHSA-xpqw-6gx7-v673), brace-expansion exponential-time {} group expansion DoS (GHSA-3jxr-9vmj-r5cp), fast-uri host confusion via literal backslash authority delimiter and failed IDN canonicalization (GHSA-v2hh-gcrm-f6hx, GHSA-4c8g-83qw-93j6)
- Production Build Missing Responsive Layout: astro-compress v2.4.1 CSS minifier silently drops all Tailwind CSS v4 responsive breakpoint queries (@media (width>=48rem) etc.) because its CSS parser doesn't support Media Queries Level 4 range syntax — the production build on Vercel rendered every page as mobile-only layout. Disabled CSS: true in astro-compress config to preserve responsive styles; CSS files grow from ~124 KB to ~142 KB uncompressed
- CI Build Failure After Astro 7.1.6 Upgrade: astro.config.ts imported unified from @astrojs/markdown-remark, a transitive dependency nested under @astrojs/mdx/node_modules/ that npm doesn't hoist to top-level node_modules on fresh installs (CI & Vercel). Added @astrojs/markdown-remark as a direct dependency to fix module resolution

Changed

- Astro 6 → 7 Major Upgrade: astro ^6.4.8 → ^7.1.3, @astrojs/vercel ^10.0.8 → ^11.0.3, @astrojs/mdx ^6.0.3 → ^7.0.3 (Astro 7 ships with Vite 8 + Rolldown, stricter SSR static-build validation)
- astro-compress Upgrade: ^2.3.8 → ^2.4.1 (picks up svgo 4.x, sharp 0.34.x)
- npm overrides Update: Added "svgo": ">=4.0.2" and "sharp": "^0.35.3" overrides to force transitive dependencies to safe versions; removed conflicting "vite": "^7" override (Astro 7 requires Vite 8)

Compatibility

- BasicScripts.astro IIFE Wrap: Astro 7 Rolldown disallows top-level return statements inside <script> blocks — wrapped the theme/language toggle script in an (() => { ... })() IIFE to preserve early-return semantics while satisfying Rolldown strict mode (context)

[0.4.0] - 2026-07-17

Added

- Hugging Face Icon Asset: Download official Hugging Face SVG logo to src/assets/images/hugging-face.svg; replace inline placeholder SVGs in ProjectCard.astro and [slug].astro with <img src={hfIcon.src}>
- Blog Post Language Variants: Posts can declare lang and translationId frontmatter to link zh/en versions — the site language toggle switches between variants on post pages (data-translation-url navigation in BasicScripts.astro), list/grid cards render both variants and swap via .i18n-zh/.i18n-en classes, and translated variants are excluded from pagination, RSS, related and adjacent posts (fetchPosts vs fetchAllPosts in blog.ts). First bilingual post: Astron SkillHub joining AAIF as Associate Member (news, zh + en)

Changed

- Search Index Blog Deduplication: search-index.json.ts now groups blog posts by translationId — bilingual pairs merge into a single entry carrying title/titleEn, excerpt/excerptEn, and both url/urlEn; monolingual posts remain as single entries. Index shrinks from 11 to 9 blog entries for 7 monolingual + 2 bilingual pairs
- SearchModal Language-Aware URLs: SearchModal.astro selects item.urlEn when system language is English, so search result clicks navigate to the correct language variant of the blog post
- PostNavigation Language-Aware: PostNavigation.astro receives the current post and uses display() helper to show prev/next titles and URLs matching the page language — bilingual posts show the translation title + URL, monolingual posts show their native content
- TableOfContents i18n: TOC sidebar heading "目录" replaced with data-i18n="blog.tableOfContents" — shows "Table of Contents" in English mode; translation key added to translations.ts

Fixed

- CI Auto-Update Workflows: Scheduled workflows (Update Project Stats, Update Contributors) failed with GH013 because GITHUB_TOKEN cannot bypass the "Protect default branch" ruleset — replaced with ADMIN_PAT secret (repo admin added to ruleset bypass list)
- Observer Redeclaration on View Transitions: const Observer in BasicScripts.astro top-level is:inline script caused SyntaxError: Identifier 'Observer' has already been declared when Astro client router swapped pages — wrapped in IIFE (() => { ... })() to create function scope, exposed as window.Observer so the theme toggle script block can access Observer.removeAnimationDelay()

[0.3.0] - 2026-07-03

Added

- Mobile Drawer Navigation: Replace hamburger-expanded nav with slide-in drawer panel (#mobile-drawer) — tree-structured navigation with always-expanded 2-level hierarchy (section labels + child links with connector dots and trunk lines), close button, backdrop overlay with blur, ESC/backdrop/link-click to dismiss, auto-close on resize to desktop, View Transitions compatible via astro:after-swap. Theme toggle (ToggleTheme) and language toggle (ToggleLanguage) moved into drawer footer for mobile, hidden on desktop via hidden md:flex wrappers
- Search Modal (SearchModal.astro): Global Ctrl+K / ⌘K search with Fuse.js fuzzy matching across blog posts, projects, adopters, events, and static pages — lazy-loaded /search-index.json, results grouped by type with <mark> match highlighting, keyboard navigation (↑↓/Enter/Esc), bilingual support (zh/en), dark mode. SearchButton.astro in header triggers modal; search-index.json.ts endpoint aggregates all content collections at build time
- Adopter Modal (AdopterModal.astro): Layout-level adopter detail modal — macOS/iOS-style frosted glass, URL hash routing (#adopter-{slug}), retry mechanism (20 attempts × 50ms) for DOM readiness, loadAdopterData() re-reads embedded JSON on every open/swap for multi-cycle reliability
- Project Detail Page Icons: [slug].astro now renders project icon image (data.icon) when available, with first-letter gradient circle fallback for projects without icons
- New Projects — MemFlywheel & Domux: Add MemFlywheel (file-native memory flywheel for AI Agents, category memory-system) and Domux (low-latency smart-home command model based on Gemma-4-E2B-it, category llm) to /projects page, project detail pages, and stats cache
- Project Card External Links: ProjectCard component supports links field (HuggingFace, ModelScope) with brand SVG icons, styled same as GitHub button, positioned next to GitHub button in card footer
- Project Detail External Links: Project detail page [slug].astro renders external links (HuggingFace, ModelScope) with brand SVG icons in Action Buttons section
- Landscape 4-Column Layout: Expand landscape from 3 to 4 columns (30%+26%+22%+22%) — new Column 4 adds Memory System (MemFlywheel) and LLM (Domux) sections with violet/rose theming; all ecosystem arrows proportionally repositioned
- Tech Blog Posts: Add 2 new tech blog posts — "MemFlywheel:给 AI Agent 装上文件原生记忆飞轮" and "Domux:150ms 内的智能家居指令理解模型", with architecture/benchmark images from GitHub repos, watermarked via scripts/watermark-images.ts
- Content Schema links Field: Add links: z.array(z.string()).optional() to project collection schema in content.config.ts
- Events Data (events.ts): Extract event data to shared src/data/events.ts for reuse across events page and search index

Changed

- Header Layout Redesign: Desktop nav keeps horizontal links; mobile nav delegates to drawer. ToggleTheme and ToggleLanguage wrapped in hidden md:flex divs (fixes Tailwind v4 inline-flex overriding hidden). BasicScripts mobile menu handlers cleaned up — no longer toggles h-screen/bg-page/overflow-hidden on header
- Adopter Modal Moved to Layout: Modal HTML + JS moved from adopters.astro (page-level) to AdopterModal.astro (layout-level in Layout.astro) — fixes View Transitions issue where page-level is:inline script wouldn't re-execute after navigation
- Landscape Mobile Scaling: Replace CSS-only transform: scale() with JS scaleLandscape() that dynamically sets wrapper height (naturalHeight × scale) — fixes excess scroll space caused by CSS transform not affecting layout box. Listens to resize and astro:after-swap
- Footer Hugging Face & ModelScope Links: Add Hugging Face (https://huggingface.co/iFlytekOpenSource) and ModelScope (https://modelscope.cn/organization/iflytek) links to footer "Related Sites" column and social icon bar (inline SVG icons via iconHtml field)
- Footer iconHtml Support: Extend Footer.astro Link interface with iconHtml field to support custom inline SVG icons for brands not available in tabler icon set
- Footer WeChat QR Modal: Add WeChat QR code modal — clicking WeChat link in footer opens a modal with group QR code image; supports ESC key, backdrop click, and Astro View Transitions re-binding
- Footer Bilingual Links: Add data-lang-zh/data-lang-en to all footer text links and column titles for language switching
- Events: Add 2 new community events — "AI Agent Industry Practice @ AtomGit & Ascend Meetup · Shanghai" (2026-06-27) and "2nd AI Innovation Exchange Conference · Tianjin" (2026-07-11)
- Auto Event Status: Event status (upcoming/ongoing/past) auto-calculated by comparing event.date with current date, removing manual status maintenance
- Projects Page Mobile Optimization: Filter bar buttons responsive sizing (text-xs/px-4 on mobile, sm:text-sm on sm+), category labels show only Chinese name on mobile via i18n-zh/i18n-en classes; card footer stacks vertically on mobile (flex-col sm:flex-row)
- Card Height Consistency: ProjectCard uses h-full on wrapper and flex h-full flex-col on card div for equal-height cards across rows
- Project Stats Cache: .cache/project-stats.json updated with 9 repos (MemFlywheel ⭐7, Domux ⭐6); .cache/contributors.json updated with 170 contributors from 60 repos
- Footer Links Updated: "联系我们" Discord link now uses real URL (https://discord.com/invite/vXzgts4fK); "相关网站" Gitee URL updated to org page, OSCHINA replaced with AtomGit; "关注我们" updated with real LinkedIn and Discord URLs, removed X/YouTube placeholders
- Secondary Links: Replaced Privacy/Terms/License with Security Policy, Community Values, and CLA
- Header Actions: Remove GitHub button from header action bar
- README: Add Hugging Face and ModelScope links to the Links section
- Code Quality: Add is:inline to AdopterModal JSON <script> tag (silences astro(4000) hint); remove deprecated position="right" from LandingLayout.astro Header — 0 errors, 0 warnings, 0 hints
- Gitignore: Add TEST_REPORT.md to temporary files section

Fixed

- Landscape Arrow Label Overlap & Title Truncation: SVG relationship arrow labels ("触发 RPA"/"提供 API") overlapped section titles; narrow column titles (AGENT-MANAGEMENT) were truncated — rotated labels vertical (rotate(-90)), added whitespace-nowrap and reduced title font 13→12px for all 8 section headers
- Search View Transitions: const DOM refs became stale after page swap — changed to let with refreshRefs() + attachElementListeners() called in astro:after-swap
- Adopter Multi-Cycle Failure: Modal broke after multiple open/close/navigation cycles — fixed by calling loadAdopterData() in every openModal(), syncHash(), and astro:after-swap handler
- Adopter Direct URL Hash: Navigating to /adopters#adopter-xxx didn't show card when DOM wasn't ready — fixed with retry mechanism (20 attempts × 50ms)
- Same-Page Hash Navigation: Search results linking to same page with hash (e.g. /adopters#adopter-agentguard) didn't trigger hashchange — fixed with e.preventDefault() + manual window.location.hash assignment
- aria-hidden Accessibility Warning: Focused element retained inside hidden modal — fixed by calling document.body.focus() and focused.blur() before hiding
- "博客" Nav Link: Added href: getBlogPermalink() to navigation config — was missing, causing the link to render as a non-navigable element
- Window Resize Losing Header Elements: BasicScripts resize handler was adding hidden class to #header > div > div:last-child (the entire right-side container including search box) — removed the offending line
- Mobile Toggle Visibility: Desktop ToggleTheme/ToggleLanguage visible in mobile menu due to Tailwind v4 class ordering (inline-flex overriding hidden) — fixed by wrapping in hidden md:flex divs

[0.2.0] - 2026-06-17

Added

- i18n Language Toggle: Client-side 中文/EN toggle button in header (ToggleLanguage.astro), persisted via localStorage.lang, effective across all pages without reload
- i18n Attribute System: data-i18n="key" attribute-based translation with central dictionary (translations.ts); data-lang-zh/data-lang-en for inline bilingual text switching
- CSS Content Visibility: .i18n-zh/.i18n-en CSS class system with html.lang-en class toggle for full-page bilingual content on static pages
- Bilingual Static Pages: Full Chinese/English content for /security (安全策略), /values (社区价值观), /cla (贡献者许可协议) using dual-div layout
- i18n Coverage: data-i18n attributes added to all pages — home, projects, project detail, contribute, events, landscape, blog, blog categories, pagination, post navigation, related posts
- Project Icons: Configure valid icon paths for 5 projects — Astron Agent, Astron RPA, AstronClaw Tutorial, HarnessClaw, SkillHub use local /images/ icons. Projects without icons (iFly Skills, HarnessClaw Engine) fall back to first-letter display with gradient background
- Adopters Page: New /adopters page showcasing 10 enterprise customer stories from iflytek/astron-agent — Donghua Software, China Telecom Suzhou, Yunsuan Digital, Xiaoqu Tech, Shandong Yungu, Guangwu Interconnect, Beijing Yugou, FiberHome, Foxit Zhongshu, Xiangyang Dongsheng. Header matches events style (gradient + blurred circles), two-row marquee with opposite scroll directions (row 1 left, row 2 right), local logo images in public/images/adopters/. i18n-aware title (用户案例 / Adopters), bilingual descriptions
- Project Card Icon Background: Remove gradient background when project has a configured icon — only show gradient for first-letter fallback
- New Projects: Add HarnessClaw (Electron desktop app, agent-management) and HarnessClaw Engine (Go LLM engine, agent-engine) — total 7 projects
- Landscape Rewrite: Complete treemap rewrite matching awesome-astron-workflow.dev/landscape — 6 categories (agentic-workflow, agentic-automation, agent-skills, tutorial, agent-management, agent-engine), 3-column layout (42%/33%/25%), SVG ecosystem arrows, bilingual labels via .i18n-zh/.i18n-en
- Landscape Download Fix: "Save HD Image" button uses CDN-based html-to-image (is:inline script) — fixes bundling issue where page-level <script> was not processed by Vite; downloads 1280×cardHeight PNG at 3x pixel ratio
- Landscape Scale Fix: Remove height constraint from scale formula (scale(min((100vw-40px)/1280, 1))), card uses min-h-[800px] instead of fixed h-[720px] — prevents bottom clipping of Skill Registry and Tutorial cards
- Landscape Background: Page header matches /projects style (from-primary-50 gradient with blurred circles); treemap section on white background
- Language Filter on Projects Page: Add language filter bar (Java, Python, TypeScript, JavaScript) with AND logic alongside category filter; project cards carry data-languages attribute for client-side filtering
- Real-time Project Stats: getProjectsWithStats() utility fetches live stars/forks from GitHub API at runtime (Vercel SSR), falls back to .cache/project-stats.json at build time
- Project Stats Script: scripts/fetch-project-stats.ts fetches stars/forks for all project repos via GitHub API, saves to .cache/project-stats.json
- Project Stats CI: .github/workflows/update-project-stats.yml — daily GitHub Action at 2:00 AM Beijing time to refresh cached stats
- Vercel SSR Pages: /projects, /projects/[slug], /contribute marked export const prerender = false for real-time data via Vercel serverless functions (Astro 6.x static mode supports per-page SSR)
- In-memory Cache: 5-minute TTL memory cache in getProjectsWithStats() and fetchContributorsLive() to reduce API calls on warm serverless invocations
- Favicon: Replace favicon and logo icon with iFLYTEK GitHub avatar (avatars.githubusercontent.com/u/26786495)
- Contributors: Fetch 164 real contributors from GitHub API (56 original repos, 8 forks excluded) replacing placeholder data
- Projects: Add 3 new categories — RPA & Automation, AI Skills, Tutorials
- Projects: Show project count (N) on category filter buttons, matching Events page style
- Contribute: Make "How to Contribute" cards clickable with links to iflytek/community (Issues, Contributing Guide, Code of Conduct)
- Contribute: Add "Good First Issues" and "Community Links" sections with Discord, GitHub links
- Blog: Add gradient header (技术博客 / Blog) matching Events page style for /blog, /category/tech, /category/news
- Home: Add card containers with hover animation to 6 feature sections (上移、阴影、边框高亮、标题变色、图标放大)
- Copyright: Use dynamic year ${new Date().getFullYear()} instead of hardcoded 2026
- Blog i18n Link Fix: BlogHighlightedPosts.astro and BlogLatestPosts.astro now use set:html for linkText to properly render data-i18n attributes (was rendering raw HTML tags as text). Homepage passes i18n-aware linkText to BlogLatestPosts
- Stats Mobile Layout Fix: Merged icon/amount and label into same container so labels stay aligned with their values on mobile; removed min-w-[220px] to keep 4 items in one row on desktop
- Adopters Modal: Click any adopter card to open a macOS/iOS-style frosted-glass detail modal with logo, full scenario, delivery and outcome sections. URL hash routing (#adopter-{slug}) for direct linking. Mobile bottom sheet, desktop centered. i18n-aware (zh/en), ESC/overlay close, language toggle sync
- Adopters Tags i18n: Add tagsEn field to all 10 adopter YAML files and content schema. Card tags use data-lang-zh/data-lang-en for language switching. Modal JS selects tagsEn/tags based on current language
- Adopters Disclaimer: Add 以上案例已获用户授权同意展示 / All cases shown have been authorized by the users footer note below marquee sections, using data-i18n translation key
- Contribute Cold-Start Optimization: contribute.astro now reads .cache/contributors.json first (committed with build, served from Vercel filesystem) for instant render on cold start. Live GitHub API fetch runs in background to refresh cache. Previous logic (API → cache fallback) inverted to cache → API refresh

Changed

- Bilingual UI Cleanup: Removed all 中文 / English dual-display patterns (title "中文 / English" → single title that switches by language mode) across all pages — contribute, events, projects, landscape, blog, category, project detail
- Landscape Subtitle: Restructured with .i18n-zh/.i18n-en blocks for full sentence translation including dynamic counts (X 个项目 → X projects)
- Category System: Renamed from 7 categories to 6 matching awesome-astron-workflow.dev — ai-platformagentic-workflow, rpa-automationagentic-automation, ai-skillsagent-skills, developer-toolsagent-skills, tutorialstutorial, added agent-management, agent-engine
- Contribute Multi-Org: fetchContributorsLive() now iterates over CONTRIBUTE_ORGS = ['iflytek', 'harnessclaw'] via Promise.all, merging contributor data from both GitHub organizations
- Homepage Background: Hero section now has gradient background (from-primary-50 to-white) with blurred accent circles, matching /projects page header style — implemented as default fallback in Hero.astro's bg slot (passing a <Fragment slot="bg"> from parent breaks Astro's CSS module injection)
- Homepage White Strip Fix: Body background changed from white to primary-50 (rgb(235 242 255)) in CustomStyles.astro — matches Hero gradient start color, eliminating white strip between browser top and navigation
- Hero Title No-Wrap: h1 uses whitespace-nowrap with responsive font sizing (text-3xl sm:text-4xl md:text-5xl lg:text-6xl) — keeps "iFLYTEK Open Source" / "科大讯飞开源" on one line across all screen sizes
- Stats Layout: Amounts row (7, 18.4K, 2.2K, Apache 2.0) and labels row (开源项目, GitHub Stars, Forks, 开源协议) now render as two separate flex rows in Stats.astro — amounts on top line, labels on bottom line
- Contribute PR Workflow: Step descriptions now bilingual (descZh/descEn) with data-lang-zh/data-lang-en switching
- Brand Name i18n: "iFLYTEK Open Source" displays as "科大讯飞开源" in Chinese mode across logo, header, homepage title, and all widget default texts via data-lang-zh/data-lang-en
- Language Change Event: BasicScripts.astro language toggle now dispatches CustomEvent('languagechange') so page-specific scripts (e.g. adopters modal) can react and re-render when language switches
- Font Stack: Add 'PingFang SC' to --font-sans and --font-heading CSS font stacks (Apple device local font only, no @font-face or font file upload)
- Blog Watermark Architecture: Watermark images now pre-baked to public/images/watermarked/ via scripts/watermark-images.ts; originals in src/assets/images/ remain untouched; <Image watermark> resolves watermarked copies via findWatermarkedImage()
- Blog Detail Page: Move featured image below article body; hide title/excerpt in header (sr-only for SEO); reduce prose font size to prose-sm lg:prose-lg
- Navigation: Rename "新闻" to "最新新闻" in nav menu; update category page title accordingly
- Project Detail Page: Replace getStaticPaths + Astro.props with dynamic Astro.params.slug lookup + getProjectsWithStats() for real-time stats on each request
- Contributors Fetching: contribute.astro now calls GitHub API directly at runtime (via native fetch) when GITHUB_TOKEN is set, falls back to .cache/contributors.json otherwise
- Fork Filtering: fetch-contributors.ts now excludes fork repos (repo.fork) and archived repos (repo.archived) to prevent upstream contributors from appearing on the wall
- Gradient Colors: Introduce semantic tokens --color-gradient-start / --color-gradient-end (referencing primary-600/accent-500) in tailwind.css, replacing hardcoded from-blue-600 to-purple-600 across all pages
- Hover Styles: Unify card hover effects across all pages — hover:shadow-lg, hover:-translate-y-0.5, dark:hover:border-primary-800 — including dark mode
- Community Files Post-processing: scripts/fetch-community-files.ts now runs postProcessFiles() in finally block on every build, auto-fixing blob/mainblob/master links and relative URL conversion even when git clone fails
- Logo: Replace 🚀 emoji with iFLYTEK avatar image in site header
- Tailwind: Define complete primary (50–950) and accent (50–950) color scales in @theme — fixes transparent text/icons caused by missing numbered variants in Tailwind v4
- Projects: Remove Featured badge, sort projects by stars only
- Projects: Wrap ProjectCard in <div class="project-card"> to fix category filter selecting filter buttons
- Events: Add dark mode hover effects (dark:hover:border-primary-800) to event cards and news cards
- Contribute: Fix all community links — blob/mainblob/master, CODE_OF_CONDUCT.mdcode-of-conduct.md (lowercase)
- Contributors Canvas: Fix rendering failure caused by DOMContentLoaded not firing during Astro View Transitions — use document.readyState check + requestAnimationFrame(boot)
- Contributors Canvas: Enlarge "iFLYTEK" text and avatar size in canvas
- Events Filter: Fix filter script with is:inline + readyState pattern for View Transitions compatibility
- Landscape Card Clipping: Remove fixed h-[720px] height, use min-h-[800px] instead — prevents bottom clipping of Skill Registry and Tutorial category cards
- Landscape Download Button: Page-level <script> is inline in Astro (not processed by Vite) — npm import('html-to-image') fails in browser. Fixed by using <script is:inline> with CDN ESM import (cdn.jsdelivr.net/npm/[email protected]/+esm)
- Projects Filter Buttons: {sortedProjects.length} inside HTML attribute quotes rendered as literal text — fixed by using backtick template literals in data-lang-zh/data-lang-en attributes
- Prettier: Add .cache, contributing.md, security.md to .prettierignore

Removed

- Unused images: app-store.png, google-play.png, hero-image.png

Fixed

- Events Page: Fixed swapped data-lang-zh/data-lang-en on event subtitle (zh was showing English and vice versa)
- Stats Widget: {title}set:html={title} so <span data-i18n> renders as DOM instead of escaped text; removed uppercase class that distorted "Projects" → "PROJECTS"
- Features Widget: Same set:html fix for itemTitle to render data-i18n spans correctly
- Blog Navigation: Fix double /blog/blog/ prefix in prev/next post links
- Dependabot #1, #2 (esbuild): Force esbuild >= 0.28.1 via package.json overrides — fixes vulnerability in transitive dependency from @astrojs/vercel (0.27.7) and tsx (0.28.0)
- Dependabot #3 (path-to-regexp): Force path-to-regexp >= 6.3.0 via package.json overrides — fixes vulnerability in transitive dependency from @vercel/routing-utils (6.1.0)
- Tailwind v4: from-primary-500, to-accent-500 and other numbered color variants rendered as transparent — fixed by defining full color scales
- View Transitions: Category filter buttons on /projects and type filter on /events did not work during client-side navigation — fixed with is:inline script and readyState check
- Community Links: 404 errors from wrong branch name (main vs master) and wrong filename case (CODE_OF_CONDUCT.md vs code-of-conduct.md)
- Project Card: data-category attribute forwarded to component conflicted with filter querySelectorAll('[data-category]') — fixed by wrapping in explicit <div class="project-card">
- ESLint/Prettier scanning .vercel/: Build output directory was being scanned by linter/formatter — fixed by adding .vercel and .cache to ignore lists

[0.1.0] - 2025-06-12

Added

- Vercel Web Analytics integration
- contributing.md and security.md referencing iflytek/community repository
- Code of Conduct file (code-of-conduct.md)

Changed

- Bump actions/checkout from 4 to 6
- Bump actions/setup-node from 4 to 6
- Bump actions/upload-artifact from 4 to 7
- Bump actions/download-artifact from 4 to 8
- Bump amondnet/vercel-action from 25 to 42
- Bump Astro and @astrojs/* dependencies
- Bump 10 dev dependencies (prettier, eslint, typescript, etc.)
- Expand allowed licenses list and update NOTICE for all dependencies
- Add OFL-1.1 license for Inter font

Fixed

- TypeScript errors and formatting issues across 16 files
- Remove unused error variable in catch block
- Conflicting license-checker flags in CI

[0.0.1] - 2024-06-11

Added

- Initial release of iFLYTEK Open Source Website
- Based on Astro 6.x + Tailwind CSS v4 + AstroWind theme
- Pages: Home, Projects, Landscape, Blog, Events, Contribute
- Projects: Astron Agent (8.5K stars) & SkillHub (3.4K stars)
- Blog: 5 posts (2 tech + 2 news + 1 welcome)
- Events: 9 community events from Astron Agent
- Contribute: Canvas avatar animation forming "iFLYTEK" text
- Features: Dark/Light/System theme, responsive design, SEO optimized
- CI/CD: GitHub Actions for PR check, deploy, security scan
- Dependabot: Automated dependency updates

---

CONTRIBUTING

Contributing to the Community


- Getting Started
- How to Contribute
- Contributor Guides
- Issue Guidelines
- Pull Request Guidelines
- Review Guidelines
- Discussions Guidelines
- Mentorship
- Contributing to Individual SIGs


Welcome to the Iflytek Opensource Community contributing guide. We are excited about the prospect of you joining our community!

Getting Started

We have full documentation on how to get started contributing:

* Community Governance - How the community is organized
* Community Membership - Membership levels and responsibilities
* Code of Conduct - Our community values and expectations

How to Contribute

1. Find something to work on - Check open issues, attend SIG meetings, or join discussions on our communication channels
2. Read the contributor guide - Understand our processes and conventions
3. File an issue - Before starting significant work, discuss your plans (see Issue Guidelines)
4. Submit a pull request - Follow our PR workflow

Contributor Guides

These documents provide detailed guidance on how to contribute effectively:

Issue Guidelines

The Issue Guidelines document covers:

* How to search for existing issues before opening a new one
* What information to include when opening an issue
* The issue triage process and how maintainers review incoming issues
* Issue lifecycle from open to resolved
* Label conventions (kind/, priority/, sig/, triage/)

Pull Request Guidelines

The Pull Request Guidelines document covers:

* The pull request process from creation to merge
* How to mark unfinished pull requests (WIP)
* Why pull requests get closed (inactivity after 90 days)
* Why your pull request might not be getting reviewed
* Best practices: smaller PRs, good comments, testing, commit messages

Review Guidelines

The Review Guidelines document covers tips for reviewers:

* Managing your time for reviews
* When to loop in others with domain-specific knowledge
* How to ask questions and request changes respectfully
* Commit hygiene expectations
* How to check out a pull request locally for deeper review

Discussions Guidelines

The Discussions Guidelines document covers:

* What discussions are for (questions, brainstorming, showcase, announcements)
* Discussion categories and when to use each
* Discussion etiquette
* When to use issues vs discussions

Mentorship

We welcome volunteers for our mentorship programs. If you're interested in mentoring or being mentored, please reach out to the community.

Contributing to Individual SIGs

Each SIG may have its own policies for editing their section of this repository. Edits in SIG sub-directories should follow any additional guidelines described by the respective SIG leads in the sub-directory's CONTRIBUTING file.

Attending a SIG meeting or posting on their communication channel is recommended if you want to make extensive contributions.

---

README

iFLYTEK Open Source Website

The official open source website for iFLYTEK (科大讯飞), showcasing our open source projects, blog, events, and community contributions.

<p align="center">
<br>
<a href="https://github.com/iflytek/website/actions/workflows/deploy.yml"><img alt="Deploy Production" src="https://github.com/iflytek/website/actions/workflows/deploy.yml/badge.svg"></a>
<a href="https://discord.com/invite/vXzgts4fK" target="_blank"><img src="https://img.shields.io/badge/Discord-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
<a href="https://github.com/iflytek/website" target="_blank"><img src="https://img.shields.io/badge/GitHub-181717?logo=github&logoColor=white" alt="GitHub"></a>
<a href="https://github.com/iflytek/community/blob/master/LICENSE" target="_blank"><img src="https://img.shields.io/badge/LICENSE-4CAF50?logo=creativecommons&logoColor=white" alt="LICENSE"></a>
</p>

🚀 Tech Stack

- Framework: Astro 6.x
- Styling: Tailwind CSS v4
- Content: MDX (Markdown + JSX)
- Language: TypeScript
- Theme: Based on AstroWind

✨ Features

- 🌓 Dark/Light/System Mode — Three theme modes with smooth transitions
- 🌐 i18n Support — Chinese and English bilingual support
- 📱 Responsive Design — Mobile, Tablet, and Desktop optimized
- 📝 Blog System — Tech blog and news with MDX support
- 🗺️ Project Landscape — CNCF-style interactive project map
- 👥 Contributor Wall — GitHub contributor avatars animation
- 🔍 SEO Optimized — Meta tags, Open Graph, Sitemap
- ⚡ Fast Performance — Hybrid rendering (SSG + SSR) with Astro

📁 Project Structure

text
website/
├── src/
│ ├── components/ # UI components
│ ├── data/ # Content (blog posts, project data)
│ ├── layouts/ # Page layouts
│ ├── navigation.ts # Navigation config
│ ├── config.yaml # Site config
│ ├── pages/ # Route pages
│ └── utils/ # Utilities
├── public/ # Static assets
├── scripts/ # Build scripts (fetch contributors, project stats, community files)
├── vendor/ # AstroWind integration
├── .cache/ # Build-time data cache (contributors, project stats)
└── .github/ # CI/CD workflows + Dependabot

🛠️ Getting Started

Prerequisites

- Node.js 24.x
- npm

Installation

bash
npm install

Development

bash
npm run dev

Visit http://localhost:4321

Build

bash
npm run build

Preview Build

bash
npm run preview

📋 Available Scripts

| Script | Description |
| ----------------------------- | ------------------------------------- |
| npm run dev | Start development server |
| npm run build | Build for production (with prebuild) |
| npm run preview | Preview production build |
| npm run check | Run all code quality checks |
| npm run check:astro | Run Astro type checking |
| npm run check:eslint | Run ESLint |
| npm run check:prettier | Run Prettier check |
| npm run fix | Auto-fix ESLint and Prettier issues |
| npm run fetch:contributors | Fetch GitHub contributor data |
| npm run fetch:project-stats | Fetch GitHub stars/forks for projects |
| npm run license:check | Check dependency licenses |
| npm run license:report | Generate license report (Markdown) |
| npm run license:summary | Show license summary |

🌍 Pages

| Route | Description |
| ----------------- | ----------------------------------------------- |
| / | Homepage |
| /projects | Project list with category and language filters |
| /projects/:slug | Individual project detail page |
| /landscape | CNCF-style project landscape |
| /blog | Blog list (tech + news) |
| /events | Community events timeline |
| /contribute | Contribution guide + contributor wall |
| /adopters | Customer case studies (10 enterprise stories) |
| /security | Security policy |
| /values | Community values |
| /cla | Contributor License Agreement |

🤝 Contributing

Please read our Contributing Guide and Code of Conduct before contributing.

📄 License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Third-party licenses are listed in NOTICE.

- Website: https://opensource.iflytek.com
- GitHub: https://github.com/iflytek
- Gitee: https://gitee.com/organizations/iflytek
- iFLYTEK Official: https://www.iflytek.com
- Discord: https://discord.com/invite/vXzgts4fK
- LinkedIn: https://www.linkedin.com/in/astron-ai
- Hugging Face: https://huggingface.co/iFlytekOpenSource
- ModelScope: https://modelscope.cn/organization/iflytek

---

SECURITY

Security Policy


- Reporting a Vulnerability
- What to Include
- What to Expect
- Supported Versions
- Security Best Practices


If you discover a security issue in this project, please follow the guidelines below.

Reporting a Vulnerability

Do not report security vulnerabilities through public GitHub issues.

Instead, please report security vulnerabilities by emailing the project's security team. The team will investigate and respond as soon as possible.

What to Include

Please include the following information in your report:

* A description of the vulnerability
* Steps to reproduce the issue
* Potential impact of the vulnerability
* Any suggested fixes or mitigations (if available)

What to Expect

* Acknowledgment: We will acknowledge receipt of your report within 48 hours
* Assessment: We will assess the vulnerability and determine the severity
* Resolution: We will work on a fix and coordinate the disclosure
* Credit: We will credit you for the discovery (unless you prefer to remain anonymous)

Supported Versions

Only the latest release receives security patches. Users are encouraged to upgrade to the latest version to receive security fixes.

Security Best Practices

* Keep all dependencies up to date
* Enable two-factor authentication on your GitHub account
* Follow the principle of least privilege when granting access
* Review code changes carefully before merging

---