{"id":432,"date":"2026-10-19T17:06:15","date_gmt":"2026-10-19T09:06:15","guid":{"rendered":"https:\/\/en.meishesdk.com\/blog\/?p=432"},"modified":"2026-10-19T17:06:16","modified_gmt":"2026-10-19T09:06:16","slug":"built-an-open-source-react-face-beauty-sdk","status":"publish","type":"post","link":"https:\/\/en.meishesdk.com\/blog\/432.html","title":{"rendered":"Built an open-source React Face Beauty SDK"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">&#8220;Open source&#8221; attached to a&nbsp;<strong>face beauty SDK<\/strong>&nbsp;usually means one of two very different things, and conflating them wastes everybody&#8217;s time. Either the processing core is published \u2014 which for a commercial imaging engine is rare \u2014 or the integration layer around it is published, so teams can see how a real product wires up sessions, preview surfaces, and look selection. We did the second. Saying so plainly beats letting people discover the difference after two days of evaluation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What we publish alongside the SDK is companion source code: a reference React integration layer, structured to be productized rather than read once and abandoned. It is not a rewrite of the engine, and it is not a distributable package you pull from a registry. The engine underneath remains the same cross-platform audio\/video processing engine used across the product family, and it stays commercial.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This article sets out exactly where that line falls, what the companion code contains, and how to adopt it without inheriting problems you did not choose.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Product Positioning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Meishe Face Beauty SDK performs face reshaping, skin smoothing, and virtual makeup compositing from a single detection pass per frame, rendered in real time with no preprocessing stage. Supported targets are iOS, Android, Web, Desktop (Windows), smart hardware, React Native, and Flutter \u2014 supported through the short-video solution \u2014 with up to 8K video editing, 16K image processing, HDR preview, and export in HLG or ST 2084. Alongside it ships companion React source code for the integration layer, aimed at teams who would rather start from something product-shaped than from a blank file.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. What &#8220;open&#8221; means here \u2014 and what it does not<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Resist the framing in the title for one paragraph, because precision here saves weeks later.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Open, for us, means readable and modifiable integration code.<\/strong>&nbsp;You receive the React layer as source files: how sessions are opened and released, how parameters are applied, how the preview surface is composed, how errors such as a lost face are surfaced to UI state.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Open does not mean the processing core is published.<\/strong>&nbsp;Detection, landmark analysis, temporal stabilisation, and rendering remain compiled engine components. That boundary is the product.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Open does not mean a distribution channel.<\/strong>&nbsp;There is nothing to install from a registry and nothing versioned for public consumption; the files arrive with the SDK distribution and you carry them in your own repository from then on.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/en.meishesdk.com\/blog\/wp-content\/uploads\/2026\/10\/2026101909054894.png\" alt=\"Built an open-source React Face Beauty SDK\" title=\"Built an open-source React Face Beauty SDK\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"570\" src=\"https:\/\/en.meishesdk.com\/blog\/wp-content\/uploads\/2026\/10\/2026101909054894-1024x570.png\" alt=\"Built an open-source React Face Beauty SDK\" alt=\"\" class=\"wp-image-433\" srcset=\"https:\/\/en.meishesdk.com\/blog\/wp-content\/uploads\/2026\/10\/2026101909054894-1024x570.png 1024w, https:\/\/en.meishesdk.com\/blog\/wp-content\/uploads\/2026\/10\/2026101909054894-300x167.png 300w, https:\/\/en.meishesdk.com\/blog\/wp-content\/uploads\/2026\/10\/2026101909054894-768x428.png 768w, https:\/\/en.meishesdk.com\/blog\/wp-content\/uploads\/2026\/10\/2026101909054894.png 1255w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">3. What ships as companion source code<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Included<\/th><th class=\"has-text-align-left\" data-align=\"left\">Not included<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Reference React components for preview and controls<\/td><td class=\"has-text-align-left\" data-align=\"left\">The compiled processing core itself<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Session lifecycle handling, incl. release patterns<\/td><td class=\"has-text-align-left\" data-align=\"left\">Any distributable runtime package<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">State hooks mapping engine events to UI state<\/td><td class=\"has-text-align-left\" data-align=\"left\">Look catalogues beyond demo samples<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Example look selection and intensity controls<\/td><td class=\"has-text-align-left\" data-align=\"left\">Server-side infrastructure or managed services<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Integration patterns for permission flows<\/td><td class=\"has-text-align-left\" data-align=\"left\">Any obligation-free rewrite of engine internals<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The practical consequence: you can fork the layer, rename it, and ship it as your own product code. You cannot remove the dependency on the engine, and you should not try, because detection and stabilisation are where most of the hard engineering lives.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. The reference React integration layer<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The snippet below is schematic. Component names, hook names, and props are illustrative and do not represent the shipped demo source.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Illustrative: the shape of the reference layer \u2014 state above, frames below.\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\ntype FaceState = \"searching\" | \"tracking\" | \"lost\";\n\nexport function useBeautySession(lookId: string) {\n  const sessionRef = useRef&lt;BeautySessionHandle | null&gt;(null);\n  const &#91;face, setFace] = useState&lt;FaceState&gt;(\"searching\");\n  const &#91;intensity, setIntensity] = useState(0.45);\n\n  useEffect(() =&gt; {\n    const handle = BeautyModule.openSession({ cadence: 3, minConfidence: 0.72 });\n    sessionRef.current = handle;\n    const off = BeautyModule.onFaceState((s) =&gt; setFace(s));\n    return () =&gt; {\n      off();\n      handle.release(); \/\/ explicit release: never rely on unmount ordering alone\n      sessionRef.current = null;\n    };\n  }, &#91;]);\n\n  const commit = useCallback((next: number) =&gt; {\n    setIntensity(next);\n    BeautyModule.setSmoothing(round(next, 2), &#91;\"eyes\", \"brows\", \"lips\", \"hairline\"]);\n    BeautyModule.applyLook(lookId, next);\n  }, &#91;lookId]);\n\n  return { face, intensity, commit };\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Three properties make this product-shaped rather than illustrative-only. Release happens in cleanup with an explicit call rather than relying on unmount ordering. Face state is an event stream mapped to React state, so &#8220;searching&#8221; and &#8220;lost&#8221; are representable rather than collapsed into silence. And commits are discrete \u2014 no per-frame traffic crosses into JavaScript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two things ship alongside the SDK for this stage: 1V1 engineering assistance during integration, and downloadable Integration Skills covering Codex, Qoder, Claude Code and Cursor for teams assembling the layer inside AI-assisted editors.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Where the companion code stops<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The demo layer deliberately does not solve everything, and knowing which parts are yours prevents a late surprise.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Recording chrome.<\/strong>&nbsp;Capture UI, timers, thumbnails, and record state remain your product&#8217;s concern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Permission policy.<\/strong>&nbsp;Handling varies by jurisdiction and by app store expectation, and we would rather you own that decision than inherit ours.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Upload and export routing.<\/strong>&nbsp;Where finished media goes after processing is entirely yours.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Asset governance.<\/strong>&nbsp;Reviewing and retiring looks is an editorial process; the demo shows wiring, not your review workflow.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. The part that stays open after launch: content<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The genuinely operationally open surface is not source code at all \u2014 it is asset data. Beauty materials ship as packages rather than compiled code, so new looks arrive through a content channel instead of an application release. Seasonal sets become an editorial decision with a rollback path, and no store review cycle stands between your team and shipping them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That property pairs well with the React layer: the demo code shows how to enumerate and apply looks, after which adding one requires no code change on your side either.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Adopting it without painting yourself into a corner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run the companion code as a starting point, then make three deliberate decisions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rename and restructure immediately.<\/strong>&nbsp;Treat the files as reference material rather than as a dependency. Once you have edited one file, it is yours.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Keep the seam typed.<\/strong>&nbsp;Whatever you rename around it, maintain a narrow typed boundary to the native module. Every untyped gap becomes a place where consumers and events drift apart silently.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Keep the release sentence.<\/strong>&nbsp;However you refactor, ensure exactly one place owns session release, and that it is idempotent. This is the defect class we see most often in adoption: incidental code paths opening sessions that nothing closes, surfacing later as a camera that refuses to reopen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One honest note to carry forward: adopting open integration code does not change the physics. Detection still fails in both directions \u2014 too strict and the effect drops on a turned or dimly lit face, too loose and it attaches to a poster \u2014 and landmark positions still move slightly between frames, producing flicker most visible at conservative intensities. The source layer makes those events visible to your UI; it does not remove them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Is the SDK engine itself published as open source?<\/strong><br>No. The processing core is a commercial product, not distributed as open source. What ships alongside it is production-ready demo source code for the integration layer \u2014 reference React components, hooks, and lifecycle patterns supplied as files to read, adapt, and ship inside your own application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Is there a package we can install from a registry?<\/strong><br>No. The companion code is not distributed as a runtime package. It arrives with the SDK distribution and thereafter lives in your repository under whatever name and structure you choose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Can we modify and ship the demo code in our product?<\/strong><br>Yes. That is the intent \u2014 it is structured to be productized rather than read once and abandoned. What you keep depending on is the engine, which handles detection and rendering.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What parts of the integration remain our responsibility?<\/strong><br>Recording UI, permission handling and policy, upload and export routing, and asset governance. The reference layer demonstrates wiring rather than deciding those for you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Is the demo layer useful outside React projects?<\/strong><br>The patterns transfer even where the code does not. Session lifecycle, discrete commits, and native-owned preview surfaces apply equally to other targets, including Flutter through the short-video solution.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ready to see it in your own stack?&nbsp;<a href=\"https:\/\/en.meishesdk.com\/register\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Request a free trial<\/a>&nbsp;or&nbsp;<a href=\"https:\/\/en.meishesdk.com\/\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >talk to our integration team<\/a>&nbsp;\u2014 we&#8217;ll help you scope the modules you actually need.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;Open source&#8221; attached to a&nbsp;face beauty SDK&nbsp;usually means one of two very different things, and conflating them wastes everybody&#8217;s time. Either the processing core is published \u2014 which for a commercial imaging engine is rare \u2014 or the integration layer around it is published, so teams can see how a real product wires up sessions, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":433,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[15,46,372,369],"class_list":["post-432","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-face-ar-sdk","tag-beauty-sdk","tag-face-beauty-sdk","tag-open-source","tag-react-native"],"_links":{"self":[{"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/posts\/432","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/comments?post=432"}],"version-history":[{"count":1,"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/posts\/432\/revisions"}],"predecessor-version":[{"id":434,"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/posts\/432\/revisions\/434"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/media\/433"}],"wp:attachment":[{"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/media?parent=432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/categories?post=432"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/en.meishesdk.com\/blog\/wp-json\/wp\/v2\/tags?post=432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}