<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Lynx Blog</title>
        <link>https://lynxjs.org/</link>
        <description>Empower the web community and invite more to build cross-platform apps</description>
        <lastBuildDate>Fri, 03 Apr 2026 03:39:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Lynx 3.6: Lynx for AI, reactlynx-use, CSS for Design Engineering]]></title>
            <link>https://lynxjs.org/blog/lynx-3-6</link>
            <guid>/blog/lynx-3-6</guid>
            <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.6 is now officially released! This release introduces Lynx for AI to enhance AI-native development capabilities, introduces reactlynx-use for improved developer experience, and enhances CSS capabilities for design expressiveness. On the native side, Lynx 3.6 improves platform integration with standalone BackgroundRuntime and asynchronous TemplateBundle creation on HarmonyOS, along with Auto Layout support for LynxView on iOS.]]></description>
            <content:encoded><![CDATA[<p><em>January 30th, 2026</em></p>
<h1 id="lynx-36-lynx-for-ai-reactlynx-use-css-for-design-engineering">Lynx 3.6: Lynx for AI, reactlynx-use, CSS for Design Engineering<a aria-hidden="true" href="#lynx-36-lynx-for-ai-reactlynx-use-css-for-design-engineering">#</a></h1>

<p>Lynx 3.6 is now officially released!</p>
<p>This release introduces Lynx for AI to enhance AI-native development capabilities, introduces <code>reactlynx-use</code> for improved developer experience, and enhances CSS capabilities for design expressiveness.</p>
<p>On the native side, Lynx 3.6 improves platform integration with standalone <code>BackgroundRuntime</code> and asynchronous <code>TemplateBundle</code> creation on HarmonyOS, along with Auto Layout support for LynxView on iOS.</p>
<p>Let's take a closer look at what's new in Lynx 3.6.</p>
<h2 id="lynx-for-ai-agentsmd-and-mcps">Lynx for AI: <code>AGENTS.md</code> and MCPs<a aria-hidden="true" href="#lynx-for-ai-agentsmd-and-mcps">#</a></h2>
<p>AI assistants are quickly becoming part of everyday development. With Lynx 3.6, we’re introducing <strong>Lynx for AI</strong>—a new section on our website at <a href="/ai">/ai</a> to help coding agents understand Lynx, follow best practices, and help you ship.</p>
<p>In this release, we’re shipping <a href="/ai/agentsmd"><code>AGENTS.md</code></a> and two MCP servers as the first building blocks for agent-friendly Lynx projects (Skills coming soon!).</p>
<h3 id="lynx-docs-mcp">Lynx Docs MCP<a aria-hidden="true" href="#lynx-docs-mcp">#</a></h3>
<p><a href="/ai/lynx-docs-mcp">Lynx Docs MCP</a> connects your coding agent (Gemini, Claude, Cursor, Copilot, etc.) to Lynx documentation via MCP, using <a href="https://lynxjs.org/llms.txt" target="_blank" rel="noopener noreferrer">llms.txt</a> plus carefully designed prompts so the agent can retrieve the right docs and act on them.</p>
<h3 id="lynx-devtool-mcp">Lynx DevTool MCP<a aria-hidden="true" href="#lynx-devtool-mcp">#</a></h3>
<p><a href="/ai/lynx-devtool-mcp">Lynx DevTool MCP</a> helps coding agents connect to devices and inspect/control Lynx pages like DevTools: read elements/console/source code, perform interactions such as clicks and drags, and capture screenshots for multimodal analysis.</p>
<h2 id="reactlynx-use-hooks-for-reactlynx"><code>reactlynx-use</code>: Hooks for ReactLynx<a aria-hidden="true" href="#reactlynx-use-hooks-for-reactlynx">#</a></h2>
<p><a href="https://lynx-community.github.io/reactlynx-use" target="_blank" rel="noopener noreferrer"><code>reactlynx-use</code></a> is a hooks toolkit for ReactLynx projects.</p>
<p>It combines two sets of hooks: community-proven utilities that follow standard React patterns (such as <code>useEffectOnce</code>, <code>useDebounce</code>, etc.), built upon the excellent foundation provided by <a href="https://github.com/streamich/react-use" target="_blank" rel="noopener noreferrer">react-use</a>, and Lynx-specific hooks that expose Lynx capabilities and its dual-thread model through a React-friendly API.</p>
<p>Notable Lynx-specific hooks include:</p>
<ul>
<li><strong>useVelocity</strong>: Track the velocity and direction of tap events on the main thread.</li>
<li><strong>useTapLock</strong>: Constrain main-thread tap interactions to a specific direction or range.</li>
<li><strong>useMainThreadImperativeHandle</strong>: A main-thread counterpart of <code>useImperativeHandle</code>.</li>
<li><strong>useEventListener</strong>: A flexible event subscription hook supporting <code>exposure</code>, <code>disexposure</code>, and more.</li>
</ul>
<p>This keeps everyday logic in familiar hooks, while making it straightforward to tap into Lynx’s main-thread input model and runtime events when you need to.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/reactlynx-use.jpeg" alt="reactlynx-use"></img></p>
<h2 id="css-for-design-engineering">CSS for Design Engineering<a aria-hidden="true" href="#css-for-design-engineering">#</a></h2>
<p>From Lynx 3.6 onward, CSS takes on a more explicit role in design engineering and design systems.
As a medium for expressing design intent, CSS describes how decisions are scoped and composed, and how visual structure and perception are formed in the interface.</p>
<p>This release focuses on improving CSS expressiveness through <strong>CSS variables</strong>, <strong>gradients</strong>, and <strong>filters</strong>.</p>
<p>For each capability, we’ve also prepared a polished demo that you can render and interact with on the web.</p>
<h3 id="inline-css-variables-for-computable-styling">Inline CSS Variables for Computable Styling<a aria-hidden="true" href="#inline-css-variables-for-computable-styling">#</a></h3>
<p>As of Lynx 3.6, <a href="/api/css/properties/css-variable">CSS variables</a> can be defined and referenced inline. This allows them to be applied directly at component boundaries (where JS-defined parameters are handed off to CSS), without relying on ancestor class switches (such as <code>theme-light</code> / <code>theme-dark</code>) or imperative JS <code>setProperty</code> calls.</p>
<p>It becomes essential when a component's style is user-selected or computed at runtime, since such continuous values cannot be represented by a finite set of predefined classes and would otherwise require imperative style updates.</p>
<pre><code>style={{
  &#39;--x&#39;: pointer.x,  // normalized parameter from JS
  backgroundColor: &#39;var(--dot-accent-color)&#39;, //defer resolution to component CSS
}}
</code></pre>
<p>Inline CSS variables provide a direct path for passing design parameters from JS into CSS's inheritance and computation model, so that design intent can be dynamically expressed and resolved while preserving component-level scoping and the declarative styling model.</p>

<h3 id="nested-css-variables-for-token-layering">Nested CSS Variables for Token Layering<a aria-hidden="true" href="#nested-css-variables-for-token-layering">#</a></h3>
<p>With Lynx 3.6, <a href="/api/css/properties/css-variable">CSS variables</a> can be defined in terms of other variables, allowing <a href="https://m3.material.io/foundations/design-tokens/overview" target="_blank" rel="noopener noreferrer">design tokens</a> to be layered and resolved compositionally.</p>
<p>Design tokens capture high-level design decisions, such as colors, typography, spacing, shadows, and glows. Nested CSS variables enable these tokens to flow down into component-level variables and concrete visual styles.</p>
<pre><code>/* Resolve and compose shadow tokens via nested CSS variables. */
.card {
  --blur: 12px;
  --ambient-shadow: 0 0 var(--blur) var(--color);
  box-shadow: var(--ambient-shadow), var(--rim-shadow);
}
</code></pre>
<p>This is especially important for composite declarations like <code>box-shadow</code>. A single <code>box-shadow</code> may contain multiple shadow layers, each combining several interacting dimensions such as offset, blur, spread, and color.
With nested CSS variables, shadow layers can now be derived, combined, and adjusted from design tokens, while keeping their structure explicit and traceable in CSS.</p>

<h3 id="conic-gradients-as-design-primitives">Conic Gradients as Design Primitives<a aria-hidden="true" href="#conic-gradients-as-design-primitives">#</a></h3>
<p>Lynx 3.6 adds support for the <a href="/api/css/data-type/gradient"><code>conic-gradient()</code></a> CSS image function. You can use it in CSS properties that accept <code>&lt;image&gt;</code> values, such as in <code>background-image</code> and <code>mask-image</code>, to create continuous angular color transitions directly in CSS.</p>
<pre><code>.bg {
  background-image: conic-gradient(from 30deg, #ff7385, #fe69a1, #00d0f1);
}
</code></pre>
<p>Conic gradients are a natural fit for angular or cyclic representations, including color wheels and hue pickers. In practice, they’re a lightweight design primitive you can compose into interactive controls and visual tools.</p>

<h3 id="css-filters-for-shape-formation">CSS Filters for Shape Formation<a aria-hidden="true" href="#css-filters-for-shape-formation">#</a></h3>
<p>Lynx 3.6 extends CSS filter support with <code>contrast</code>, <code>brightness</code>, and <code>saturate</code>.</p>
<p>With these additions, the CSS <a href="/api/css/properties/filter"><code>filter</code></a> property becomes a composable tool for shape formation.
The newly supported <code>contrast</code> filter, when combined with the existing <code>blur</code> capability, amplifies overlapping regions and allows soft shapes to merge into coherent forms.</p>
<p>Visual structures such as merging, perceptual grouping, and fluid boundaries can be constructed directly in CSS, without relying on bitmap assets or custom rendering pipelines.</p>

<h2 id="native-apis">Native APIs<a aria-hidden="true" href="#native-apis">#</a></h2>
<h3 id="standalone-backgroundruntime-on-harmonyos">Standalone BackgroundRuntime on HarmonyOS<a aria-hidden="true" href="#standalone-backgroundruntime-on-harmonyos">#</a></h3>
<p>HarmonyOS now supports standalone <a href="/api/lynx-native-api/lynx-background-runtime">BackgroundRuntime</a>, aligning more closely with existing Android and iOS capabilities.</p>
<p>With standalone BackgroundRuntime, developers can run JavaScript tasks independently of rendering, or pre-create background runtimes to reduce LynxView initialization latency.</p>
<h3 id="asynchronous-templatebundle-creation-on-harmonyos">Asynchronous TemplateBundle Creation on HarmonyOS<a aria-hidden="true" href="#asynchronous-templatebundle-creation-on-harmonyos">#</a></h3>
<p>On Android and iOS, <a href="/api/lynx-native-api/template-bundle/from-template"><code>TemplateBundle.fromTemplate</code></a> can be called from any thread. On HarmonyOS, however, ArkTS logic must run on the application's main thread.</p>
<p>To reduce main-thread I/O blocking, Lynx 3.6 introduces asynchronous APIs for creating <code>TemplateBundle</code> instances on HarmonyOS:</p>
<ul>
<li><a href="/api/lynx-native-api/template-bundle/from-template-async"><code>TemplateBundle.fromTemplateAsync</code></a></li>
<li><a href="/api/lynx-native-api/template-bundle/from-template-async-with-option"><code>TemplateBundle.fromTemplateAsyncWithOption</code></a></li>
</ul>
<h3 id="autolayout-support-for-lynxview-on-ios">AutoLayout Support for LynxView on iOS<a aria-hidden="true" href="#autolayout-support-for-lynxview-on-ios">#</a></h3>
<p>On iOS, LynxView now supports Auto Layout via <a href="/api/lynx-native-api/lynx-view/enable-auto-layout"><code>[LynxView enableAutoLayout]</code></a>.</p>
<p>When enabled, LynxView can derive layout parameters directly from client-side Auto Layout constraints, eliminating the need to configure layout values manually.</p>
<h2 id="upgrade-guide">Upgrade Guide<a aria-hidden="true" href="#upgrade-guide">#</a></h2>
<p>To upgrade to Lynx 3.6, follow the <a href="https://lynxjs.org/3.6/guide/start/integrate-with-existing-apps.html" target="_blank" rel="noopener noreferrer">integration guide</a> and update your Lynx dependency versions accordingly.
<strong>Lynx for AI</strong></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx 3.5: Main Thread Script, React Compiler, HarmonyOS Improvements]]></title>
            <link>https://lynxjs.org/blog/lynx-3-5</link>
            <guid>/blog/lynx-3-5</guid>
            <pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.5 is now officially released! Following our stable bi-monthly release cadence, Lynx 3.5 brings several key improvements. This release adds experimental support for React Compiler, enhances main thread scripts with `stopPropagation` for better event bubbling control, enables immediate interactivity after first-frame rendering, and improves cross-thread communication. We've also expanded HarmonyOS platform support and introduced new features like the `pointer-events` CSS property.]]></description>
            <content:encoded><![CDATA[<p><em>November 10th, 2025</em></p>
<h1 id="lynx-35-main-thread-script-react-compiler-harmonyos-improvements">Lynx 3.5: Main Thread Script, React Compiler, HarmonyOS Improvements<a aria-hidden="true" href="#lynx-35-main-thread-script-react-compiler-harmonyos-improvements">#</a></h1>

<p>Lynx 3.5 is now officially released!</p>
<p>Following our stable bi-monthly release cadence, Lynx 3.5 brings several key improvements. This release adds experimental support for React Compiler, enhances main thread scripts with <code>stopPropagation</code> for better event bubbling control, enables immediate interactivity after first-frame rendering, and improves cross-thread communication. We've also expanded HarmonyOS platform support and introduced new features like the <code>pointer-events</code> CSS property.</p>
<p>Let's dive in and see what's new!</p>
<h2 id="react-compiler">React Compiler <a aria-hidden="true" href="#react-compiler">#</a></h2>
<p><a href="https://react.dev/learn/react-compiler" target="_blank" rel="noopener noreferrer">React Compiler</a> optimizes components at compile time, so you don't need to manually add <code>useMemo</code>, <code>useCallback</code>, or <code>memo</code>. You can now use React Compiler in ReactLynx to optimize your app's performance.</p>
<p><a href="/en/react/react-compiler">Learn how to enable React Compiler in ReactLynx</a>.</p>
<h2 id="main-thread-script">Main Thread Script<a aria-hidden="true" href="#main-thread-script">#</a></h2>
<h3 id="event-stop-propagation">Event Stop Propagation <a aria-hidden="true" href="#event-stop-propagation">#</a></h3>
<p>When an event fires, it <a href="https://lynxjs.org/3.5/guide/interaction/event-handling/event-propagation" target="_blank" rel="noopener noreferrer">propagates</a> through event bubbling, allowing different parts of your UI to handle it. Previously, Lynx only supported static event bubbling interception via <a href="https://lynxjs.org/3.5/guide/interaction/event-handling/event-propagation#event-interception" target="_blank" rel="noopener noreferrer"><code>catch</code>-type event handler attributes</a>, which lacked the flexibility of web standards. With Lynx 3.5, main thread scripts now support <a href="https://lynxjs.org/3.5/api/lynx-api/event/event.html#stoppropagation" target="_blank" rel="noopener noreferrer"><code>event.stopPropagation()</code></a>, giving you runtime control over event bubbling that matches what you'd expect on the web.</p>
<pre><code meta="">function handleInnerTap(e: MainThread.TouchEvent) {
  'main thread';
  e.stopPropagation(); // ✋ stop event bubbling
  flash('inner');
}
</code></pre>

<h3 id="immediate-interactivity-after-first-frame">Immediate Interactivity After <a href="https://lynxjs.org/3.5/guide/interaction/ifr.html" target="_blank" rel="noopener noreferrer">First-Frame</a><a aria-hidden="true" href="#immediate-interactivity-after-first-frame">#</a></h3>
<p>Previously, main thread events had to wait for the background thread to complete <a href="https://lynxjs.org/3.5/guide/react/lifecycle.html" target="_blank" rel="noopener noreferrer">hydration</a> before responding, creating a frustrating delay where the page looked ready but wasn't interactive, similar to the <a href="https://web.dev/articles/rendering-on-the-web#rehydration" target="_blank" rel="noopener noreferrer">uncanny valley effect commonly seen in server-side rendering</a>.</p>
<p>To eliminate this delay, we optimized the hydration process so that main thread events can respond immediately after the first frame is rendered. After the background thread hydrates, it correctly takes over the state from the main thread and replays <a href="https://lynxjs.org/3.5/api/react/Function.runOnBackground.html" target="_blank" rel="noopener noreferrer"><code>runOnBackground</code></a> calls, ensuring proper synchronization between threads while achieving immediate interactivity as soon as the first frame is visible.</p>
<pre><code meta="">function App() {
  const gotoUser = () => {
    'main thread';
    // go to second page
  };
  return (
    <view main-thread:bindtap={gotoUser}>
      <text>goto user</text>
    </view>
  );
}
</code></pre>
<h3 id="cross-thread-function-calls-now-return-values">Cross-Thread Function Calls Now Return Values<a aria-hidden="true" href="#cross-thread-function-calls-now-return-values">#</a></h3>
<p>Lynx provides <a href="https://lynxjs.org/3.5/api/react/Function.runOnMainThread#function-runonmainthread" target="_blank" rel="noopener noreferrer"><code>runOnMainThread</code></a> and <a href="https://lynxjs.org/3.5/api/react/Function.runOnBackground.html" target="_blank" rel="noopener noreferrer"><code>runOnBackground</code></a> for cross-thread function calls. In Lynx 3.5, both APIs now support async return values, making cross-thread communication more flexible and intuitive.</p>
<pre><code meta="">

function App() {
  const countRef = useMainThreadRef(0);

  const addCount = (value) => {
    'main thread';
    countRef.current += value;
    return countRef.current;
  };

  const increaseMainThreadCount = async () => {
    // await for return value from main thread
    const result = await runOnMainThread(addCount)(1);
    console.log(result);
  };
}
</code></pre>
<h2 id="built-in-animations-for-list-updates">Built-in Animations for <code>&lt;list&gt;</code> Updates<a aria-hidden="true" href="#built-in-animations-for-list-updates">#</a></h2>
<p>The <code>&lt;list&gt;</code> element now includes default <a href="https://lynxjs.org/3.5/api/elements/built-in/list.html#update-animation" target="_blank" rel="noopener noreferrer">update animations</a> out of the box. When you add, remove, or update list items, smooth transitions are applied automatically—no extra code needed.</p>
<pre><code>&lt;list update-animation=&quot;default&quot;&gt;&lt;/list&gt;
</code></pre>

<h2 id="css-property-pointer-events">CSS Property: <code>pointer-events</code> <a aria-hidden="true" href="#css-property-pointer-events">#</a></h2>
<p>Lynx 3.5 adds support for the <a href="https://lynxjs.org/3.5/api/css/properties/pointer-events.html" target="_blank" rel="noopener noreferrer"><code>pointer-events</code></a> CSS property, giving you control over whether an element can receive touch events.</p>
<pre><code>pointer-events: auto;  // Default value. The element can be the target of touch events.
pointer-events: none;  // The element cannot be the target of touch events.
</code></pre>

<h2 id="harmonyos-improvements">HarmonyOS Improvements<a aria-hidden="true" href="#harmonyos-improvements">#</a></h2>
<h3 id="fetch-api">Fetch API<a aria-hidden="true" href="#fetch-api">#</a></h3>
<p>Lynx provides a <a href="https://lynxjs.org/3.5/api/lynx-api/global/fetch" target="_blank" rel="noopener noreferrer">Fetch API</a> that follows web standards, so it works just like you'd expect. With Lynx 3.5, Fetch API support extends to HarmonyOS, making cross-platform development even easier.</p>
<h3 id="accessibilityannounce">accessibilityAnnounce<a aria-hidden="true" href="#accessibilityannounce">#</a></h3>
<p>Lynx 3.5 adds <a href="https://lynxjs.org/3.5/api/lynx-api/lynx/lynx-accessibility-announce.html" target="_blank" rel="noopener noreferrer"><code>accessibilityAnnounce()</code></a> support on HarmonyOS, bringing it in line with Android and iOS. This method lets screen readers announce specific text, helping visually impaired users understand interface changes and action results.</p>
<pre><code>lynx.accessibilityAnnounce(
  {
    content: &#39;hello lynx&#39;,
  },
  (res) =&gt; {
    console.log(&#39;result: &#39; + JSON.stringify(res));
  },
);
</code></pre>
<h3 id="requestresourceprefetch">requestResourcePrefetch<a aria-hidden="true" href="#requestresourceprefetch">#</a></h3>
<p>The <a href="https://lynxjs.org/3.5/api/lynx-api/lynx/lynx-request-resource-prefetch.html" target="_blank" rel="noopener noreferrer"><code>requestResourcePrefetch</code></a> API is now available on HarmonyOS, matching Android and iOS support. Use it to prefetch CDN resources like images, videos, and audio files for faster loading.</p>
<pre><code>lynx.requestResourcePrefetch?.(
  {
    data: [
      {
        uri: &#39;https://demo.org/test.jpg&#39;,
        type: &#39;image&#39;,
        params: { priority: &#39;high&#39;, cacheTarget: &#39;disk&#39; },
      },
    ],
  },
  (res) =&gt; {
    console.log(
      &#39;prefetch status of each resource:&#39;,
      JSON.stringify(res.details),
    );
  },
);
</code></pre>
<h2 id="upgrade-guide">Upgrade Guide<a aria-hidden="true" href="#upgrade-guide">#</a></h2>
<p>To upgrade to Lynx 3.5, follow the <a href="https://lynxjs.org/3.5/guide/start/integrate-with-existing-apps.html" target="_blank" rel="noopener noreferrer">integration guide</a> and update your Lynx dependency versions.</p>
<h2 id="one-more-thing-desktop-support-preview">One More Thing: Desktop Support Preview<a aria-hidden="true" href="#one-more-thing-desktop-support-preview">#</a></h2>
<p>We <a href="/blog/lynx-open-source-roadmap-2025.html">previously planned</a> for Lynx 3.5 to introduce desktop support. At the time, our plan was to open source our custom rendering pipeline and low-level integration APIs for desktop. Since then, we've decided to go further and open source the full desktop stack to give you a more battery-included experience. As a result, we would have to adjust our timeline to early 2026.</p>
<p>To get a preview of where we are heading, and how our approach both learns from and differs from prior arts like
<a href="https://www.electronjs.org/" target="_blank" rel="noopener noreferrer">Electron</a> and <a href="https://www.qt.io/" target="_blank" rel="noopener noreferrer">Qt</a>, check out the talk <strong>"Bringing Lynx to Desktop and Beyond"</strong> from our Multi-Platform Lead <a href="https://x.com/adservc1" target="_blank" rel="noopener noreferrer">ZhiXuan Wang</a> at <a href="https://ubuntu.com/summit" target="_blank" rel="noopener noreferrer">Ubuntu Summit 2025</a>:</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing Lynx for HarmonyOS]]></title>
            <link>https://lynxjs.org/blog/lynx-harmony</link>
            <guid>/blog/lynx-harmony</guid>
            <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are happy to share that Lynx now provides public beta support for HarmonyOS, delivering feature parity in CSS, Elements, and APIs — along with the same level of native performance and user experience.]]></description>
            <content:encoded><![CDATA[<p><em>September 25, 2025</em></p>
<h1 id="announcing-lynx-for-harmonyos">Announcing Lynx for HarmonyOS<a aria-hidden="true" href="#announcing-lynx-for-harmonyos">#</a></h1>

<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/lynx-harmony-background1.png" alt="lynx-harmony-background"></img></p>
<p>As introduced in the <a href="/blog/lynx-unlock-native-for-more.html">open-sourcing blog</a>, Lynx's vision continues to be unlocking native for more platforms and more users. With HarmonyOS now adding new platform and device diversity to the market, we want to enable Lynx developers to reach these users with the same ease they already enjoy on Android, iOS, and Web with Lynx.</p>
<p>Today, we are happy to share that <strong>Lynx now provides public beta support for HarmonyOS</strong>, delivering feature parity in <a href="/guide/ui/styling.html">CSS</a>, <a href="/api/elements/built-in/view.html">Elements</a>, and <a href="/api/index.html">APIs</a> — along with the same level of native performance and user experience.</p>
<h2 id="consistent-rendering-for-harmonyos">Consistent Rendering for HarmonyOS<a aria-hidden="true" href="#consistent-rendering-for-harmonyos">#</a></h2>
<p>In <a href="/guide/start/tutorial-gallery.html">Tutorial: Product Gallery</a> we built a complex page using Lynx. Let's see how Lynx performs on Android vs HarmonyOS. As shown below, it achieves pixel-perfect alignment. This allows Lynx developers to <strong>write once, run everywhere</strong> - one codebase for Android, iOS, Web, and HarmonyOS apps, improving efficiency and maintainability.</p>

<p>The high consistency of Lynx's CSS and native elements across Android, iOS, and HarmonyOS is attributed to our architectural decision: <strong>Lynx's rendering pipeline is shared and consistent across multiple platforms</strong>. On HarmonyOS, we implement the same set of CSS, animations, and custom component by swapping the paint layer to issue instructions to <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkui-overview" target="_blank" rel="noopener noreferrer">ArkUI</a>.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/lynx-harmony-imp.png" alt="lynx-harmony-background"></img></p>
<h2 id="native-lynx-for-harmonyos">Native Lynx for HarmonyOS<a aria-hidden="true" href="#native-lynx-for-harmonyos">#</a></h2>
<h3 id="native-painting-with-arkui">Native Painting with ArkUI<a aria-hidden="true" href="#native-painting-with-arkui">#</a></h3>
<p>Lynx on Harmony uses <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkui-overview" target="_blank" rel="noopener noreferrer">ArkUI components</a> for painting. Lynx with OpenHarmony explored two approaches: <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-ui-development-overview" target="_blank" rel="noopener noreferrer">ArkTS</a> and <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ndk-build-ui-overview" target="_blank" rel="noopener noreferrer">C API</a>.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/lynx-harmony-ui.png" alt="lynx-harmony-ui"></img></p>
<p>We finally chose C API to directly map Lynx <a href="https://lynxjs.org/guide/spec.html#platform-ui-tree" target="_blank" rel="noopener noreferrer">platform-ui-tree</a> to HarmonyOS native UI, combining Lynx performance with ArkTS ecosystem benefits.</p>
<ul>
<li>
<p><strong>Native UI Rendering</strong>: Using <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkui-overview" target="_blank" rel="noopener noreferrer">ArkUI's</a> <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ndk-build-ui-overview" target="_blank" rel="noopener noreferrer">C API</a> to convert <a href="https://lynxjs.org/guide/spec.html#element-tree" target="_blank" rel="noopener noreferrer">element-tree</a> operations directly to native UI calls, eliminating data conversion overhead for better performance in complex UI updates.</p>
</li>
<li>
<p><strong>Custom Native Element</strong>: By utilizing HarmonyOS's <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-user-defined-arktsnode-buildernode" target="_blank" rel="noopener noreferrer"><code>BuilderNode</code></a> and <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builder" target="_blank" rel="noopener noreferrer"><code>Builder</code></a> capabilities, developers can dynamically construct ArkTS subtrees and seamlessly embed them into the ArkUI node tree created by Lynx, achieving highly customized component implementations.</p>
</li>
</ul>
<h3 id="native-interactions">Native Interactions<a aria-hidden="true" href="#native-interactions">#</a></h3>
<p>Lynx designed a complete event system that captures and responds to gestures and events in complex interactions.</p>

<ul>
<li><strong>Custom HitTest</strong>: Accurately find the nodes responding to events on the Lynx platform-ui-tree, ensuring precise interactions.</li>
<li><strong>Gesture Support</strong>: Integrates HarmonyOS gesture like <a href="https://lynxjs.org/api/lynx-api/event/touch-event#tap" target="_blank" rel="noopener noreferrer"><code>tap</code></a> and <a href="https://lynxjs.org/api/lynx-api/event/touch-event#longpress" target="_blank" rel="noopener noreferrer"><code>longpress</code></a>, ensuring native-like gesture experience on Lynx.</li>
<li><strong>Custom Gesture Control in Embedded Scenarios</strong>: Offers a comprehensive set of event APIs, including <a href="https://lynxjs.org/api/elements/built-in/view.html#user-interaction-enabled" target="_blank" rel="noopener noreferrer"><code>user-interaction-enabled</code></a> and <a href="https://lynxjs.org/api/elements/built-in/view.html#block-native-event" target="_blank" rel="noopener noreferrer"><code>block-native-event</code></a>, empowering Lynx developers to manage event propagation and handling logic for efficient processing of nested scrolling scenarios with native pages.</li>
</ul>
<h3 id="native-extensions">Native Extensions<a aria-hidden="true" href="#native-extensions">#</a></h3>
<ul>
<li><strong>Native Element Customization</strong>: Lynx provides rich <a href="https://lynxjs.org/api/elements/built-in/view.html" target="_blank" rel="noopener noreferrer">built-in elements</a> and supports integration of custom HarmonyOS native elements (via ArkTS), enabling developers to extend UI capabilities for highly customized interfaces while preserving native performance. More details: <a href="/guide/custom-native-component.html#platform=harmony">Custom Element</a>.</li>
<li><strong>Native Modules</strong>: Lynx enables developers to call HarmonyOS native APIs from JavaScript, supporting both system services and custom native modules. More detail: <a href="/guide/use-native-modules.html#platform=harmony">Native Modules</a>。</li>
</ul>
<h2 id="create-your-first-lynx-on-harmonyos">Create Your First Lynx on HarmonyOS<a aria-hidden="true" href="#create-your-first-lynx-on-harmonyos">#</a></h2>
<p>Lynx's official website offers <a href="/guide/start/integrate-with-existing-apps.html#platform=harmony">development documentation</a> and <a href="https://github.com/lynx-family/integrating-lynx-demo-projects/tree/main/harmony/HarmonyEmptyProject" target="_blank" rel="noopener noreferrer">demo code</a> for developers to get started quickly and efficiently.</p>
<ol>
<li>
<p><strong>Use the Pre-built Lynx Explorer</strong>: For the easiest development setup, follow the <a href="/guide/start/quick-start.html">Quick Start</a> to install the Lynx Explorer hap package and begin Lynx development.</p>
</li>
<li>
<p><strong>Local Build of Lynx Explorer</strong>: Developers interested in exploring the Lynx on HarmonyOS source code can also attempt local builds by following the guide <a href="https://github.com/lynx-family/lynx/tree/develop/explorer/harmony" target="_blank" rel="noopener noreferrer">Building Lynx Explorer for Harmony</a>.</p>
</li>
<li>
<p><strong>Integrate with Existing Apps on HarmonyOS</strong>: For developers with existing HarmonyOS application projects seeking to integrate Lynx, the official website provides <a href="/guide/start/integrate-with-existing-apps.html#platform=harmony">Integrate with Existing Apps</a>.</p>
</li>
</ol>
<p>Welcome to the Lynx community. Let's build outstanding native experiences with Lynx on HarmonyOS!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx 3.4: HarmonyOS Support, Trace and Recorder, Text Input Elements]]></title>
            <link>https://lynxjs.org/blog/lynx-3-4</link>
            <guid>/blog/lynx-3-4</guid>
            <pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.4 is now officially released! This release features new platform support for HarmonyOS, enables Windows development, launches new developer tools *Trace* and *Recorder*, open-sources the highly requested `<input>` and `<textarea>` elements, offers even more flexible animations, supports variable fonts, and more.]]></description>
            <content:encoded><![CDATA[<p><em>September 3rd, 2025</em></p>
<h1 id="lynx-34-harmonyos-support-trace-and-recorder-text-input-elements">Lynx 3.4: HarmonyOS Support, Trace and Recorder, Text Input Elements<a aria-hidden="true" href="#lynx-34-harmonyos-support-trace-and-recorder-text-input-elements">#</a></h1>

<p>Lynx 3.4 is now officially released!</p>
<p>In line with the <a href="/blog/lynx-open-source-roadmap-2025">technical roadmap</a> announced earlier this year, we've kept a steady bimonthly release rhythm. We skipped a blog for Lynx 3.3 since it had few user-facing features, but that release set the stage for a packed 3.4 releases, bringing new platform support for HarmonyOS, enabling Windows development, launching new developer tools <em>Trace</em> and <em>Recorder</em>, open-sourcing the highly-requested <code>&lt;input&gt;</code> and <code>&lt;textarea&gt;</code> elements, even more flexible animations, variable fonts, and more!</p>
<h2 id="new-platform-support">New Platform Support<a aria-hidden="true" href="#new-platform-support">#</a></h2>
<h3 id="harmonyos-support-public-beta">HarmonyOS Support Public Beta<a aria-hidden="true" href="#harmonyos-support-public-beta">#</a></h3>
<p>Lynx now officially supports the <a href="https://www.harmonyos.com/en/" target="_blank" rel="noopener noreferrer">HarmonyOS</a> platform. Developers can integrate Lynx into their HarmonyOS applications by following our <a href="/guide/start/integrate-with-existing-apps.html#platform=harmony">Integration Guide</a>.
Additionally, we will soon be publishing a dedicated blog that takes a closer look at Lynx on HarmonyOS. Stay tuned.</p>
<p><img src="https://tosv-sg.tiktok-row.org/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/background.png" alt=""></img></p>
<h3 id="support-for-windows-development">Support for Windows Development<a aria-hidden="true" href="#support-for-windows-development">#</a></h3>
<ul>
<li>
<p>The build tool <a href="/rspeedy">Rspeedy</a> now supports the Windows, enabling developers to develop and build Lynx projects on Windows PCs;</p>
</li>
<li>
<p>Developers can successfully compile the Android Lynx Engine and <a href="/guide/start/quick-start.html#prepare-lynx-explorer">LynxExplorer</a> application in a Windows environment;</p>
</li>
</ul>
<p>Support for the Windows version of Devtool desktop is currently in development and will be released soon.</p>
<h2 id="new-developer-tools">New Developer Tools<a aria-hidden="true" href="#new-developer-tools">#</a></h2>
<p>Lynx 3.4 introduces two developer tools dedicated to improving the developer experience and debugging efficiency.</p>
<h3 id="trace">Trace<a aria-hidden="true" href="#trace">#</a></h3>
<p><a href="/guide/devtool/trace">Trace</a> delivers comprehensive, end-to-end insight into your Lynx app’s rendering pipeline. From parsing and construction to layout and rendering, Trace captures and visualizes every stage of your page’s lifecycle. What was once a “black box” is now a transparent, interactive map of your app’s inner workings. Developers can finally observe, understand, and optimize performance at the deepest levels, making it easier than ever to identify bottlenecks and fine-tune for maximum efficiency.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/trace-tool-overview-latest2.png" alt=""></img></p>
<h3 id="recorder">Recorder<a aria-hidden="true" href="#recorder">#</a></h3>
<p><a href="/guide/devtool/recorder">Recorder</a> is your time machine for Lynx apps. It logs every aspect of your app’s runtime behavior—from external resource loading and native module calls (with results), to the complete stream of user interactions. These sessions can be exported and replayed with pixel-perfect accuracy in LynxExplorer, transforming elusive, hard-to-reproduce bugs and tricky asynchronous issues into solvable problems. With Recorder, debugging is as easy as pressing “play,” offering clarity and confidence even in the most complex scenarios.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/recorder-concept.png" alt=""></img></p>
<h2 id="text-input-elements">Text Input Elements<a aria-hidden="true" href="#text-input-elements">#</a></h2>
<p>In a recent UI capability survey conducted within the Lynx community, <code>&lt;input&gt;</code>/<code>&lt;textarea&gt;</code> elements emerged as the most highly anticipated core features, garnering over 50% of the vote.</p>
<p>Lynx 3.4 delivers two core text input elements.
We will continue to improve core elements. Developers are welcome to continue voting in the <a href="https://github.com/lynx-family/lynx/discussions/673" target="_blank" rel="noopener noreferrer">discussion</a> to help shape Lynx's future.</p>
<h3 id="single-line--element">Single-line <a href="/api/elements/built-in/input"><code>&lt;input&gt;</code></a> Element<a aria-hidden="true" href="#single-line--element">#</a></h3>

<h3 id="multi-line--element">Multi-line <a href="/api/elements/built-in/textarea"><code>&lt;textarea&gt;</code></a> element<a aria-hidden="true" href="#multi-line--element">#</a></h3>

<h2 id="list-recycle-optimization">List Recycle Optimization<a aria-hidden="true" href="#list-recycle-optimization">#</a></h2>
<p>Lynx 3.4 optimizes the recycling strategy of the <code>&lt;list&gt;</code> element to improve rendering performance.</p>
<h3 id="recycle-list-sticky-item">Recycle <code>&lt;list&gt;</code> Sticky Item<a aria-hidden="true" href="#recycle-list-sticky-item">#</a></h3>
<p>When a <code>&lt;list-item&gt;</code> is scrolled out of the <code>&lt;list&gt;</code> viewport, the original recycling mechanism would cache the item for reuse. Prior to Lynx 3.4, <code>&lt;list-item&gt;</code> elements with the sticky attribute were not recycled. In long lists making heavy use of the sticky feature, this could lead to high memory usage. Lynx 3.4 optimizes this strategy; sticky items are now also recycled after scrolling out of the viewport.
If this change adversely affects your existing scenarios, you can temporarily disable this optimization by setting <a href="/api/elements/built-in/list.html#experimental-recycle-sticky-item"><code>experimental-recycle-sticky-item={false}</code></a>. If you encounter any issues, please provide feedback via an issue.</p>

<h3 id="prevent-list-item-from-being-recycled">Prevent <code>&lt;list-item&gt;</code> from Being Recycled<a aria-hidden="true" href="#prevent-list-item-from-being-recycled">#</a></h3>
<p>When a <code>&lt;list-item&gt;</code> contains complex components, recycling and re-updating the node incurs significant CPU overhead. Developers can now set <code>recyclable={false}</code> to <a href="/api/elements/built-in/list.html#not-recycle-list-item">prevent specific <code>&lt;list-item&gt;</code> from being recycled</a>. Once disabled, the item will not be recycled when it slides out of the viewport and won't require re-rendering when it reappears, making it suitable for scenarios demanding rendering performance.</p>

<h2 id="more-flexible-animations">More Flexible Animations<a aria-hidden="true" href="#more-flexible-animations">#</a></h2>
<h3 id="elementanimate"><code>Element.animate()</code><a aria-hidden="true" href="#elementanimate">#</a></h3>
<p>The <a href="/api/lynx-api/main-thread/main-thread-element"><code>MainThread.Element</code></a> now features an animate() method for finely controlling CSS animations on the MTS (Main Thread Scripting), including operations like play, pause, and seeking, enabling more flexible interactive animations.</p>

<h3 id="css-variables-triggering-transition">CSS Variables Triggering Transition<a aria-hidden="true" href="#css-variables-triggering-transition">#</a></h3>
<p>Transition animations can now be triggered by changes in CSS variables, enhancing the flexibility and maintainability of transition animations. In multi-theme designs, developers can associate animation parameters with theme variables. Switching themes only requires modifying the variable values without changing selector logic to complete the theme transition.</p>

<h2 id="variable-fonts">Variable Fonts<a aria-hidden="true" href="#variable-fonts">#</a></h2>
<p>Lynx 3.4 adds support for variable fonts. Developers can now perform finer adjustments to font styles using underlying CSS properties like font-variation-settings and font-optical-sizing.
Read the <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_fonts/Variable_fonts_guide" target="_blank" rel="noopener noreferrer">MDN</a> and <a href="https://web.dev/articles/variable-fonts" target="_blank" rel="noopener noreferrer">web.dev</a> guides to learn more about variable fonts technology.</p>

<h2 id="upgrade-guide">Upgrade Guide<a aria-hidden="true" href="#upgrade-guide">#</a></h2>
<p>Refer to the official guide on <a href="/zh/guide/start/integrate-with-existing-apps.html">Integrating Lynx into Existing Apps</a>, update the Lynx and LynxService dependency versions to complete the upgrade to Lynx 3.4.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What’s new in Lynx 3.2]]></title>
            <link>https://lynxjs.org/blog/lynx-3-2</link>
            <guid>/blog/lynx-3-2</guid>
            <pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.2 delivers updates across its framework, engine, and tools, including the ReactLynx testing tools, `llms.txt` support, new Grid Layout features, improvements to `<list>` and `<text>`, and more.]]></description>
            <content:encoded><![CDATA[<p><em>May 14th, 2025</em></p>
<h1 id="whats-new-in-lynx-32">What’s new in Lynx 3.2<a aria-hidden="true" href="#whats-new-in-lynx-32">#</a></h1>

<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/lynx-3-2.png" alt="lynx-in-3-2"></img></p>
<p>Today, I'm pleased to share that Lynx 3.2, the first version of Lynx since we <a href="/blog/lynx-unlock-native-for-more">open-sourced</a> it in March 2025, is now stable!</p>
<p>Lynx 3.2 delivers updates across its framework, engine, and tools, including the <a href="#reactlynx-testing-library">ReactLynx testing tools</a>, <a href="#websitellmstxt-support"><code>llms.txt</code> support</a>, <a href="#css-grid-layoutminmaxmax-contentfit-content">new Grid Layout features</a>, improvements to <a href="#improvements-tolist"><code>&lt;list&gt;</code></a> and <a href="#text-can-be-customized-to-select-across-multiple-elements"><code>&lt;text&gt;</code></a>, and more, to bring you more familiar development experience and more capabilities. With over <a href="https://github.com/lynx-family/lynx/releases/" target="_blank" rel="noopener noreferrer">296 commits</a> from 61 contributors (including some first-time contributors). Let’s explore what’s new!</p>
<h2 id="reactlynx-testing-library">ReactLynx Testing Library<a aria-hidden="true" href="#reactlynx-testing-library">#</a></h2>
<p><a href="https://testing-library.com/" target="_blank" rel="noopener noreferrer">Testing Library</a> is a popular way in the JavaScript community to test UI components, and we've adapted it for Lynx. We now introduce a new package <a href="/api/reactlynx-testing-library/index"><code>@lynx-js/react/testing-library/</code></a> to provide testing abstractions such as <a href="/api/reactlynx-testing-library/Function.render.html"><code>render</code></a>. It can also be used with the official <a href="https://github.com/testing-library/jest-dom" target="_blank" rel="noopener noreferrer"><code>@testing-library/jest-dom</code></a> to assert the presence and behavior of elements using matchers such as <a href="https://github.com/testing-library/jest-dom?tab=readme-ov-file#tobeinthedocument" target="_blank" rel="noopener noreferrer"><code>toBeInTheDocument</code></a>.</p>
<pre><code>import &#39;@testing-library/jest-dom&#39;;



it(&#39;renders&#39;, () =&gt; {
  const Wrapper = ({ children }) =&gt; (
    &lt;view data-testid=&quot;wrapper&quot;&gt;{children}&lt;/view&gt;
  );
  const Comp = () =&gt; (
    &lt;view data-testid=&quot;inner&quot; style=&quot;background-color: yellow;&quot; /&gt;
  );
  const { container, getByTestId } = render(&lt;Comp /&gt;, { wrapper: Wrapper });

  expect(getByTestId(&#39;wrapper&#39;)).toBeInTheDocument();
  expect(container.firstChild).toMatchInlineSnapshot(`
    &lt;view data-testid=&quot;wrapper&quot;&gt;
      &lt;view data-testid=&quot;inner&quot; style=&quot;background-color: yellow;&quot;/&gt;
    &lt;/view&gt;
  `);
});
</code></pre>
<p><a href="/react/reactlynx-testing-library">Learn more about how to use ReactLynx Testing Library here.</a></p>
<h2 id="website-llmstxt-support">Website: <code>llms.txt</code> Support<a aria-hidden="true" href="#website-llmstxt-support">#</a></h2>
<p>By upgrading to <a href="https://v2.rspress.dev/" target="_blank" rel="noopener noreferrer">Rspress v2</a> and taking advantage of the new <a href="https://x.com/rspack_dev/status/1917844832149725695" target="_blank" rel="noopener noreferrer">LLM plugin</a>, the Lynx website is now fully equipped with <a href="https://lynxjs.org/llms.txt" target="_blank" rel="noopener noreferrer"><a href="https://lynxjs.org/llms.txt" target="_blank" rel="noopener noreferrer">https://lynxjs.org/llms.txt</a></a> and <a href="https://lynxjs.org/llms-full.txt" target="_blank" rel="noopener noreferrer"><a href="https://lynxjs.org/llms-full.txt" target="_blank" rel="noopener noreferrer">https://lynxjs.org/llms-full.txt</a></a> to help with AI understanding and improve your experience vibe-coding with Lynx. For every page you can get the original markdown by replacing the .html extension with .md.</p>
<p><a href="https://llmstxt.org/" target="_blank" rel="noopener noreferrer">Learn more about what is <code>llms.txt</code></a>.</p>
<h2 id="css-grid-layout-minmax-max-content-fit-content">CSS Grid Layout: <code>minmax()</code>, <code>max-content</code>, <code>fit-content</code> <a aria-hidden="true" href="#css-grid-layout-minmax-max-content-fit-content">#</a></h2>
<p>Lynx 3.2 adds three CSS functions <code>minmax()</code>, <code>max-content</code>, and <code>fit-content</code>, to help you better controll grid sizes in the <a href="/guide/ui/layout/grid-layout.html">CSS Grid Layout</a>. You can use them in <code>grid-template-columns</code>, <code>grid-template-rows</code>, <code>grid-auto-columns</code>, and <code>grid-auto-rows</code>.</p>
<p>Let's take a look at an example of building a three-column grid with <code>grid-template-columns: 20% max-content minmax(50px, max-content)</code>:</p>
<ul>
<li>First column: Takes up 20% of the container width</li>
<li>Second column: Sizes itself to fit its content using <code>max-content</code></li>
<li>Third column: Uses <code>minmax(50px, max-content)</code> to have a minimum width of 50px but can grow to fit content</li>
</ul>

<h2 id="improvements-to-list">Improvements to <code>&lt;list&gt;</code><a aria-hidden="true" href="#improvements-to-list">#</a></h2>
<h3 id="scroll-snapping-with-item-snap">Scroll Snapping with <code>item-snap</code><a aria-hidden="true" href="#scroll-snapping-with-item-snap">#</a></h3>
<p>The <a href="/api/elements/built-in/list.html#item-snap"><strong>scroll snapping</strong></a> feature has graduated to a stable feature in Lynx 3.2. It provides smooth and easy to use pagination across all platforms, enabling developers to create feeds or carousels with precise scrolling interactions.</p>

<p><a href="/api/elements/built-in/list.html#pagination-withitem-snap">Learn more about implementing Pagination with <code>item-snap</code>.</a></p>
<h3 id="z-index-support-in-list-item"><code>z-index</code> Support in <code>&lt;list-item&gt;</code> <a aria-hidden="true" href="#z-index-support-in-list-item">#</a></h3>
<p>Lynx 3.2 supports <a href="/zh/api/css/properties/z-index.html"><strong>z-index</strong></a> on <code>&lt;list-item&gt;</code>, allowing for more flexible adjustment of the view hierarchy of list items.</p>

<h2 id="text-can-be-customized-to-select-across-multiple-elements"><code>&lt;text&gt;</code> Can Be Customized to Select Across Multiple Elements <a aria-hidden="true" href="#text-can-be-customized-to-select-across-multiple-elements">#</a></h2>
<p>In long article scenarios, with the newly added <a href="/api/elements/built-in/text.html#custom-text-selection"><code>custom-text-selection</code></a> attribute, you can now <a href="/api/elements/built-in/text.html#crosstext-selection-and-copying">implement customized logic</a> to select and copy text across text elements, making the text selection experience more similar to the Web.</p>

<h2 id="microtasks">Microtasks <a aria-hidden="true" href="#microtasks">#</a></h2>
<p>Before Lynx 3.2, Lynx did not support micro-task. The behavior of the following code is inconsistent with that in web browsers. In Lynx 3.2, <code>Promise</code> based on microtasks is implemented, and a new API <a href="/api/lynx-api/lynx/lynx-queue-microtask"><code>lynx.queueMicrotask</code></a> is delivered.</p>
<pre><code>setTimeout(() =&gt; {
  console.log(&#39;this is a timeout, will exec after&#39;);
}, 0);

Promise.resolve().then((value) =&gt; {
  console.log(&#39;this is a Promise, will exec before&#39;);
});
</code></pre>
<table>
<thead>
<tr>
<th>Results in Lynx before 3.2</th>
<th>Results in Chrome</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/lynx-test-result.png" alt=""></img></td>
<td><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/chrome-test-result.png" alt=""></img></td>
</tr>
</tbody>
</table>
<h2 id="more-console-apis">More <code>console</code> APIs <a aria-hidden="true" href="#more-console-apis">#</a></h2>
<p>Lynx 3.2 further implements most of the <a href="https://developer.mozilla.org/en-US/docs/Web/API/console" target="_blank" rel="noopener noreferrer">W3C-compliant</a> <code>console</code> APIs to provide a more comprehensive debugging experience. See the <a href="/api/lynx-api/global/console/assert.html">API Reference</a> for more details.</p>

<h2 id="rspeedy-rslib-and-rspack-13">Rspeedy: Rslib and Rspack 1.3<a aria-hidden="true" href="#rspeedy-rslib-and-rspack-13">#</a></h2>
<p>Rspeedy <a href="https://github.com/lynx-family/lynx-stack/discussions/482" target="_blank" rel="noopener noreferrer">v0.9.0</a> is now available, featuring significant improvements in size and performance. In v0.9.0, Rspeedy bundles with <a href="https://lib.rsbuild.dev/" target="_blank" rel="noopener noreferrer">Rslib</a>, reducing installation size by 50%. The upgrade to <a href="https://rspack.dev/" target="_blank" rel="noopener noreferrer">Rspack</a> <a href="https://rspack.dev/blog/announcing-1-3" target="_blank" rel="noopener noreferrer">1.3</a> delivers enhanced code splitting, optimized bundle size, and improved memory efficiency. Additional enhancements include new CLI flags and configurations. For more details, refer to the complete full CHANGELOG <a href="https://github.com/lynx-family/lynx-stack/blob/main/packages/rspeedy/core/CHANGELOG.md#090" target="_blank" rel="noopener noreferrer"><code>@lynx-js/rspeedy v0.9.0</code></a>.</p>
<p>To upgrade, run the following command in your Rspeedy project:</p>
<pre><code>npx upgrade-rspeedy@latest
</code></pre>
<h2 id="devtool-screen-mirroring-with-resolution-control">DevTool: Screen Mirroring with Resolution Control<a aria-hidden="true" href="#devtool-screen-mirroring-with-resolution-control">#</a></h2>
<p>DevTool's screen mirroring feature, located in the left panel, now includes resolution switching capabilities. Users can toggle between High Definition (HD) and Standard Definition (SD) modes. The SD mode is particularly useful for reducing bandwidth consumption during unstable device connections, ensuring smoother screen mirroring performance.</p>
<p>Download the latest DevTool Desktop Application from the <a href="https://github.com/lynx-family/lynx-devtool/releases/tag/v0.0.2" target="_blank" rel="noopener noreferrer">DevTool Release</a> page to get started.</p>

<h2 id="upgrade-to-lynx-32">Upgrade to Lynx 3.2<a aria-hidden="true" href="#upgrade-to-lynx-32">#</a></h2>
<h3 id="android">Android<a aria-hidden="true" href="#android">#</a></h3>
<p>Please refer to the <a href="/guide/start/integrate-with-existing-apps.html#platform=ios">integrate-with-existing-apps</a> and update your Lynx and LynxService dependencies.</p>
<p>In your project's <code>build.gradle</code> or <code>build.gradle.kts</code> file, update the Lynx version as follows:</p>

<p>In your project's <code>build.gradle</code> or <code>build.gradle.kts</code> file, update the LynxService version:</p>

<h3 id="ios">iOS<a aria-hidden="true" href="#ios">#</a></h3>
<p>In your project's <code>Podfile</code> file, update the Lynx version as follows:</p>

<p>In your project's <code>Podfile</code> file, update the LynxService version as follows:</p>

<h2 id="final-words">Final Words<a aria-hidden="true" href="#final-words">#</a></h2>
<p>Thanks to Lynx community for making this release possible! As a newly open-source project, we're thrilled about our future and we can’t wait to see the use of Lynx in your apps.</p>
<p>In the future, we will gradually introduce more feature support as our <a href="/blog/lynx-open-source-roadmap-2025.html">roadmap</a>. We'll add new components like <code>&lt;Input&gt;</code> and adapt to more platforms such as HarmonyOS and PC.</p>
<p>Please check the <a href="https://github.com/lynx-family/lynx/releases/tag/3.2.0" target="_blank" rel="noopener noreferrer">release notes and changelog</a>, and let’s embark on a new adventure!</p>
<hr></hr>
<p><em>Thanks to <a href="https://x.com/huxpro" target="_blank" rel="noopener noreferrer">Xuan Huang</a>, <a href="https://x.com/zoolsher" target="_blank" rel="noopener noreferrer">Ray Zhang</a>, and <a href="https://x.com/liushouqun" target="_blank" rel="noopener noreferrer">Shouqun Liu</a> for their contributions in creating this blog post.</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx Roadmap 2025]]></title>
            <link>https://lynxjs.org/blog/lynx-open-source-roadmap-2025</link>
            <guid>/blog/lynx-open-source-roadmap-2025</guid>
            <pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Two weeks ago, we launched Lynx as an open-source project and have since gathered valuable insights and feedback from the community. Thank you for engaging with Lynx, even as we take our first steps as a new member of the open-source cross-platform ecosystem. Today, I'm pleased to share the 2025 roadmap of Lynx.]]></description>
            <content:encoded><![CDATA[<p><em>March 19th, 2025</em></p>
<h1 id="lynx-roadmap-2025">Lynx Roadmap 2025<a aria-hidden="true" href="#lynx-roadmap-2025">#</a></h1>

<p><a href="/blog/lynx-unlock-native-for-more">Two weeks ago</a>, we launched Lynx as an open-source project and have since gathered valuable insights and feedback from the community. Thank you for engaging with Lynx, even as we take our first steps as a new member of the open-source cross-platform ecosystem. Today, I'm pleased to share the 2025 roadmap of Lynx.</p>
<p>Our core principles in developing the Lynx technology family and building the Lynx tech ecosystem are:</p>
<ul>
<li><strong>Fast and stable releases</strong>: Ensuring rapid version updates while maintaining a stable API with minimal breaking changes.</li>
<li><strong>Versatile cross-platform</strong>: Empowering developers with efficient, high-performance solutions across major platforms.</li>
<li><strong>Strong community support</strong>: Engaging with developers through <a href="https://github.com/orgs/lynx-family" target="_blank" rel="noopener noreferrer">GitHub</a>, <a href="https://discord.com/invite/mXk7jqdDXk" target="_blank" rel="noopener noreferrer">Discord</a>, StackOverflow, etc.</li>
</ul>
<h2 id="release-schedule">Release Schedule<a aria-hidden="true" href="#release-schedule">#</a></h2>
<p>We believe that consistent version releases are crucial for a developer framework to ensure features and refinements reach users effectively. In 2025, we plan to publish 5 stable releases.</p>
<table>
<thead>
<tr>
<th><strong>Stable Release Version</strong></th>
<th>3.2</th>
<th>3.3</th>
<th>3.4</th>
<th>3.5</th>
<th>3.6</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Planned Release Date</strong></td>
<td>2025/04</td>
<td>2025/06</td>
<td>2025/08</td>
<td>2025/10</td>
<td>2025/12</td>
</tr>
</tbody>
</table>
<h2 id="documentation">Documentation<a aria-hidden="true" href="#documentation">#</a></h2>
<p>High-quality documentation and examples are essential for a great developer experience. Our team is committed to publishing and maintaining accurate, up-to-date documentation on our website (<a href="https://lynxjs.org" target="_blank" rel="noopener noreferrer">https://lynxjs.org</a>).
Additionally, the website's repository is open-sourced (<a href="https://github.com/lynx-family/lynx-website" target="_blank" rel="noopener noreferrer">https://github.com/lynx-family/lynx-website</a>) and will be maintained transparently. We highly welcome any feedback or contributions to our documentation.</p>
<h2 id="multiple-platforms">Multiple Platforms<a aria-hidden="true" href="#multiple-platforms">#</a></h2>
<p>We are providing a cross-platform framework for building apps across a wide range of platforms. This includes mobile platforms like Android, iOS, and the Web, all of which we have already open-sourced. Additionally, Lynx supports desktop environments such as Windows and macOS, as well as emerging platforms like OpenHarmony. With coverage across those major platforms, we have a clear plan to continue open-sourcing our framework this year.</p>
<ul>
<li>Support for Android, iOS, and the Web are already open sourced. We will continue enhancing cross-platform consistency and performance on these platforms to provide developers with better solutions for building mobile applications.</li>
<li>OpenHarmony: We plan to open source Lynx OpenHarmony support on version 3.4.</li>
<li>macOS and Windows: We also plan to release Lynx macOS and Windows support to open source on version 3.5.</li>
</ul>
<h2 id="more-capabilities--ui-elements">More Capabilities & UI Elements<a aria-hidden="true" href="#more-capabilities--ui-elements">#</a></h2>
<p>We have received multiple requests for additional APIs and components, as well as feedback on integrating Lynx into various products. To empower developers in building fully fledged applications with Lynx, in addition to the already open-sourced core engine and front-end stack, we plan to open-source more peripherals this year, including:</p>
<ul>
<li>Additional UI elements and components, such as input, view pagers, swiper, and SVG support.</li>
<li>Support for <a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API" target="_blank" rel="noopener noreferrer">Canvas</a> and advanced animations, such as <a href="https://airbnb.io/lottie/" target="_blank" rel="noopener noreferrer">Lottie</a>, along with our open-source implementations.</li>
<li>App-level capabilities, including native navigation and APIs for features like notifications, location, and more.</li>
</ul>
<h2 id="tooling">Tooling<a aria-hidden="true" href="#tooling">#</a></h2>
<p>We also received a lot of feedback about the toolchain's compatibility on Windows and Linux platforms. Moving forward, we'll ensure toolchain support across major development platforms, including macOS, Windows, and Linux.</p>
<p>For developer tools, we will continue improving the capability and stability of DevTools. Later this year, we plan to introduce performance profilers to help developers diagnose and resolve possible performance issues.</p>
<h2 id="community">Community<a aria-hidden="true" href="#community">#</a></h2>
<p>As a family of technologies designed to empower developers, we believe a strong community ecosystem is essential to its success. That's why we have open-sourced our technologies, and will continue building and enhancing the community.</p>
<ul>
<li>To advance our vision of democratizing cross-platform technologies, we aim to collaborate with the community to further enhance the <a href="/guide/spec.html#element-papi">Element PAPI</a>, making it more framework-agnostic and better suited to support more frameworks on Lynx engine.</li>
<li>We are dedicated to actively discussing, responding to, and addressing developers' feedback across all major community platforms, including Discord, GitHub, and StackOverflow.</li>
</ul>
<hr></hr>
<p>After open-sourcing Lynx, our team has been overwhelmed by the enthusiasm of the community. We've received a wealth of feedback on improving the framework, which has greatly motivated each of us. In the future, we look forward to collaborating with the community and continuously releasing updates to support developers.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx: Unlock Native for More]]></title>
            <link>https://lynxjs.org/blog/lynx-unlock-native-for-more</link>
            <guid>/blog/lynx-unlock-native-for-more</guid>
            <pubDate>Wed, 05 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we're excited to introduce Lynx, a family of technologies empowering developers to use their existing web skills to create truly native UIs for both mobile and web from a single codebase...]]></description>
            <content:encoded><![CDATA[<p><em>March 5th, 2025</em></p>
<h1 id="lynx-unlock-native-for-more">Lynx: Unlock Native for More<a aria-hidden="true" href="#lynx-unlock-native-for-more">#</a></h1>

<p>Today, we're excited to introduce <strong>Lynx</strong>, a <em>family</em> of technologies empowering developers to use their existing web skills to create truly native UIs for both mobile and web from a single codebase. Designed for diverse use cases and rich interactivity, Lynx delivers vibrant and engaging UIs for large-scale apps like TikTok, featuring a speedy, versatile rendering engine, performance-driven dual-threaded UI programming, modern Rust-based tooling, and more!</p>
<p>We deeply appreciate all the prior arts that have shaped the field of cross-platform development, and aspire to contribute to this movement by <strong>open sourcing</strong> Lynx today, inviting more developers to build applications with more freedom and productivity.</p>
<h2 id="ship-native-at-scale-and-velocity">Ship Native at Scale and Velocity<a aria-hidden="true" href="#ship-native-at-scale-and-velocity">#</a></h2>
<p>For the generation of digital natives, mobile phones—and the apps on them—are their first digital experiences. For these app-centric users, a non-native experience isn't just inconvenient; it's a red flag. A blank screen, a 0.1s lag in a "like" animation, or an unfamiliar UI pattern can make an interface feel "cheap" or untrustworthy. We believe that native primitives and responsiveness aren't just nice-to-haves—<strong><em>native is a necessity</em></strong>.</p>
<p>Despite the rapid growth of the app economy, delivering such experiences at <em>scale</em> and <em>velocity</em> remains to be a challenge. The growing diversity of form factors and platforms forces developers to rebuild the same experiences multiple times, leading to wasted effort, siloed teams, and delayed time-to-market. We believe that by enabling developers to build once and reach more platforms, <em>we can deliver joys <strong>for more users, faster</strong></em>.</p>
<p>TikTok, known and loved as a mobile-first platform, continuously brings innovative and engaging experiences to diverse and dynamic users around the world. To meet these demands, it gradually adopted Lynx and has increasingly bet on it. Today, Lynx powers an extremely wide spectrum of surfaces—from the lightweight, high-frequency <strong>Search</strong> panel to full-fledged <a href="https://support.tiktok.com/en/using-tiktok/creating-videos/tiktok-studio" target="_blank" rel="noopener noreferrer">TikTok Studio</a> app; from complex e-commerce storefronts like <strong>Shop</strong> that demand reliability and trust, to highly engaging experiences like <strong>LIVE</strong>, as well as powering high-profile events and cultural moments such as <a href="https://newsroom.tiktok.com/en-us/disney-100" target="_blank" rel="noopener noreferrer">Disney100 on TikTok</a> and <a href="https://newsroom.tiktok.com/en-us/tiktok-goes-to-the-met-gala" target="_blank" rel="noopener noreferrer">The Met Gala on TikTok</a>.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-in-tiktok.jpg" alt="lynx-in-tiktok"></img></p>

<p>We believe <em>scale</em> and <em>velocity</em> mean more than just applying a feature, bug fix, or optimization across all platforms to improve cost efficiency. It also means the <em>versatility</em> to adapt the same shared technological foundation to a broad spectrum of scenarios—without the need to build new teams or reinvent the wheel for every unique use case.</p>
<h2 id="inspire-and-enrich-the-web-community">Inspire and Enrich the Web community<a aria-hidden="true" href="#inspire-and-enrich-the-web-community">#</a></h2>
<p>The web platform was historically created for <a href="https://www.w3.org/People/Berners-Lee/WorldWideWeb.html" target="_blank" rel="noopener noreferrer">documents</a> and then <a href="https://extensiblewebmanifesto.org/#signatories" target="_blank" rel="noopener noreferrer">gradually</a> <a href="https://infrequently.org/2015/06/progressive-apps-escaping-tabs-without-losing-our-soul/" target="_blank" rel="noopener noreferrer">evolved</a> into a development platform. Yet, it continues to <a href="https://infrequently.org/2020/06/platform-adjacency-theory/" target="_blank" rel="noopener noreferrer">face constraints</a> that slow down its ability to adapt and innovate quickly. Therefore, shaping the web technologies for cross-platform development has become a defining norm in the industry. Since 2008, PhoneGap (later <a href="https://cordova.apache.org/" target="_blank" rel="noopener noreferrer">Cordova</a>) <a href="https://web.archive.org/web/20161210233245/http://phonegap.com/blog/2012/05/09/phonegap-beliefs-goals-and-philosophy/" target="_blank" rel="noopener noreferrer">strived to keep the Web as cross-platform solution</a> by augmenting Webview with native capabilities. In 2015, <a href="https://reactnative.dev/blog/2015/03/26/react-native-bringing-modern-web-techniques-to-mobile" target="_blank" rel="noopener noreferrer">React Native pioneered bridging native UI with web technologies</a>, enabling declarative UI with React.js on mobile. That same year, <a href="https://developers.googleblog.com/en/flutter-10-googles-portable-ui-toolkit/" target="_blank" rel="noopener noreferrer">Flutter</a>, with its web heritage, adopted a similar declarative UI model and introduced a new approach using a custom rendering engine.</p>
<p>Lynx followed a similar spirit—you can think of it as an <strong><em>"alternative Web tailored for app development</em>"</strong>. It aims to honor the assets of web technologies while taking an opinionated approach, supporting web-like APIs and adding constraints and extensions with clear intent.</p>
<p>To illustrate this balance, let me share two examples: one where we choose to follow the web and another where we intentionally make a difference.</p>
<h3 id="craft-designs-with-markups-and-css-as-usual">Craft Designs with Markups and CSS as Usual<a aria-hidden="true" href="#craft-designs-with-markups-and-css-as-usual">#</a></h3>
<p>At its core, UI technologies exist to deliver exceptional product design. Lynx embraces the familiarity of web development, allowing developers to write markup and CSS just as they would for the web. Lynx natively supports <a href="/guide/styling/animation.html">CSS animations and transitions</a>, <a href="/guide/styling/custom-theming.html">CSS selectors and variables for theming</a>, and modern CSS visual effects like <a href="/guide/styling/appearance.html#gradient">gradients</a>, <a href="/guide/styling/appearance.html#clipping-and-masking">clipping, and masking</a>—all designed to unlock the creativity of the web community to achieve trending <em>design engineering</em>.</p>


<h3 id="use-the-main-thread-responsibly-for-interactivity">Use the Main Thread Responsibly for Interactivity<a aria-hidden="true" href="#use-the-main-thread-responsibly-for-interactivity">#</a></h3>
<p>One of Lynx's most notable architectural decisions is its <strong>statically-enforced division</strong> of user scripting into two distinct runtimes: a <em><a href="/guide/spec.html#main-thread-or-lynx-main-thread">main-thread</a> runtime</em>, powered by <a href="https://github.com/lynx-family/primjs" target="_blank" rel="noopener noreferrer"><strong>PrimJS</strong></a>, a custom JavaScript engine specifically optimized for Lynx, dedicated to privileged, synchronous UI tasks like initial launch and high-priority event handling, and a <em><a href="/guide/spec.html#background-thread-aka-off-main-thread">background</a> runtime</em> as the default for user code, ensuring the main thread remains low workload and <em>non-blocking</em>. This enables two killer features of Lynx:</p>
<ol>
<li>
<p><a href="/guide/interaction/ifr.html"><em>Instant First-Frame Rendering (IFR)</em></a>: Backed by <a href="https://www.nngroup.com/articles/response-times-3-important-limits/" target="_blank" rel="noopener noreferrer">usability research</a>, if rendering is fast enough—and Lynx is—no special intermediate feedback is needed. By briefly blocking the main thread until the first frame is fully rendered, Lynx eliminates blank screens, creating a perceived instant experience.</p>
</li>
<li>
<p><a href="/react/main-thread-script.html"><em>Main-Thread Scripting (MTS)</em></a>: A small, statically scheduled piece of code, privileged to run on the main thread, handles high-priority events and gestures—making it ideal for implementing silky-smooth, highly responsive interfaces that feels native.</p>
</li>
</ol>

<p>Do you notice how instant the <em>IFR</em> feels and how snappy the <em>MTS</em> is?
Let's <strong>slow them down by 4x</strong> so we can take a closer look!</p>

<p>Internally, we've seen surfaces migrating from Web to Lynx often achieve a <strong>2–4× reduction in launch times</strong> across the board. Our in-house benchmarks also show that Lynx consistently launches faster on Android while remaining competitive with similar technologies on iOS.</p>
<h2 id="open-sourcing-lynx">Open Sourcing Lynx<a aria-hidden="true" href="#open-sourcing-lynx">#</a></h2>
<p>Lynx was originally developed by an engineering team of ByteDance, which continue to drive its development. As a significant user of Lynx, TikTok recognizes the innovation and potential of Lynx and has been making extensive use of it in a series of TikTok applications. TikTok will facilitate the open-source release of Lynx, offering support in several areas, including funding, technical enhancement, community promotion, and ecosystem growth.</p>
<h3 id="democratize-cross-platform-technologies">Democratize Cross-Platform Technologies<a aria-hidden="true" href="#democratize-cross-platform-technologies">#</a></h3>
<p>For years, cross-platform development for web developers has been defined by the patterns and solutions established by a few dominant players. While we celebrate their remarkable contribution, there is a growing demand for greater diversity in approaches. Lynx seeks to change that by not open-sourcing a single fixed solution, but a <strong><em>meta-infrastructure</em></strong> that enables teams and businesses facing similar scale and velocity challenges to build their own cross-platform solutions.</p>
<p>We are open-sourcing <a href="/react/"><strong>ReactLynx</strong></a> ("React on Lynx") as Lynx's initial frontend framework flavor, enabling componentized, declarative UI on Lynx. <em>However, Lynx isn't limited to React</em>. In fact, other frameworks already represent roughly half of Lynx's overall usage, demonstrating its neutrality in hosting different flavors. As modern apps grow increasingly complex, with dozens or even hundreds of developers collaborating on a single app, Lynx ships with <a href="/rspeedy/"><strong>Rspeedy</strong></a>, a toolchain based on the popular Rust-based bundler <a href="https://rspack.dev/" target="_blank" rel="noopener noreferrer">Rspack</a>, to enable fast builds and pave the way for a multi-framework <a href="https://en.wikipedia.org/wiki/Micro_frontend" target="_blank" rel="noopener noreferrer">micro-frontend</a> future via <a href="https://module-federation.io/" target="_blank" rel="noopener noreferrer">Module Federation</a>. We are eager to work with the open-source JavaScript framework community to bring even greater diversity to cross-platform development.</p>
<p>Not only is <a href="https://github.com/lynx-family/lynx" target="_blank" rel="noopener noreferrer">the core engine</a> of Lynx framework-agnostic, but it's also agnostic to host platforms and rendering backends. Drawing inspiration from a spectrum of projects like <a href="https://www.chromium.org/chromium-projects/" target="_blank" rel="noopener noreferrer">Chromium</a>, <a href="https://github.com/flutter" target="_blank" rel="noopener noreferrer">Flutter</a>, and <a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer">React Native</a>, it's designed to adapt to new platform primitives, and it's flexible enough to switch to a <em>custom renderer</em>, enabling pixel-perfect, consistent rendering across any platforms with a graphics interface. With <a href="https://github.com/lynx-family/lynx-stack/tree/main/packages/web-platform" target="_blank" rel="noopener noreferrer"><strong>Lynx for Web</strong></a>, Lynx can even run natively within web browsers. Together, they give Lynx ultimate flexibilities in how it can expand to even more platforms, such as Desktop, TV, or IoT devices.</p>
<h3 id="this-is-not-the-end-but-a-new-beginning">This Is Not the End, But a New Beginning<a aria-hidden="true" href="#this-is-not-the-end-but-a-new-beginning">#</a></h3>
<p>Lynx is <em>production-ready</em> and already powers an incredible number of businesses. What we are open-sourcing today is the exact version we use in production, which is why it starts at version 3.x. It even includes legacy code and APIs we intend to deprecate, but we believe in opening source what we actually rely on. In fact, <strong>we are moving all development to</strong> <strong>GitHub</strong>, making it open and transparent to the community.</p>
<p>This release marks only the beginning. What we are open sourcing today is <em>not</em> everything. Many peripherals that we're proud of—including additional UI components, advanced built-in graphics capabilities, the custom renderer, and other frameworks—are yet to come.</p>
<p>More importantly, this is the beginning of the journey because, as a relatively young team in the open-source space, we know we have much to learn about working, collaborating, and growing with the community. But we are glad we took this step, because we believe open source is the right path forward—<strong>to foster collaboration, push the boundaries of what's possible in cross-platform development, and give back to the community that has given us so much</strong>. We invite you to join us on this exciting journey and welcome your feedback and contributions.</p>
<p><em>What will you build with Lynx?</em></p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-unlock-native-for-more.png" alt="lynx-unlock-native-for-more"></img></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx Blog]]></title>
            <link>https://lynxjs.org/blog/</link>
            <guid>/blog/</guid>
            <content:encoded><![CDATA[<h1 id="lynx-blog">Lynx Blog<a aria-hidden="true" href="#lynx-blog">#</a></h1>
<p>Where the Lynx team post release notes and official announcements here. You can also follow <a href="https://x.com/lynxjs_org" target="_blank" rel="noopener noreferrer">@lynxjs_org</a> on X, but you won't miss anything if you only read this blog.</p>
]]></content:encoded>
        </item>
    </channel>
</rss>