<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sushant Kumar</title>
    <description>The latest articles on DEV Community by Sushant Kumar (@sushant_kumar_e398386037a).</description>
    <link>https://dev.to/sushant_kumar_e398386037a</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4014198%2F52aaf553-c3c9-4860-9298-862e56bfce0a.jpg</url>
      <title>DEV Community: Sushant Kumar</title>
      <link>https://dev.to/sushant_kumar_e398386037a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sushant_kumar_e398386037a"/>
    <language>en</language>
    <item>
      <title>How to Add Face Liveness Detection to Flutter in 5 Minutes</title>
      <dc:creator>Sushant Kumar</dc:creator>
      <pubDate>Fri, 03 Jul 2026 22:28:55 +0000</pubDate>
      <link>https://dev.to/sushant_kumar_e398386037a/how-to-add-face-liveness-detection-to-flutter-in-5-minutes-4p42</link>
      <guid>https://dev.to/sushant_kumar_e398386037a/how-to-add-face-liveness-detection-to-flutter-in-5-minutes-4p42</guid>
      <description>&lt;p&gt;Spoofing attacks — where someone holds up a photo or plays a video to trick your face verification — are a &lt;strong&gt;real problem&lt;/strong&gt; for mobile apps.&lt;/p&gt;

&lt;p&gt;In this post I'll show you how to add &lt;strong&gt;passive face liveness detection&lt;/strong&gt; to a Flutter app in under 5 minutes using &lt;strong&gt;FaceNova SDK&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is passive liveness detection?
&lt;/h2&gt;

&lt;p&gt;Unlike &lt;strong&gt;active liveness&lt;/strong&gt; (where the user has to blink, smile or turn their head), &lt;strong&gt;passive liveness&lt;/strong&gt; works silently from a single frame. The user just looks at the camera — no instructions needed.&lt;/p&gt;

&lt;p&gt;FaceNova's on-device AI model detects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Printed photo attacks&lt;/li&gt;
&lt;li&gt;✅ Video replay attacks (phone/tablet/laptop screen)&lt;/li&gt;
&lt;li&gt;✅ 3D mask attacks&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;All processing runs &lt;strong&gt;on-device&lt;/strong&gt;. No face images sent to any server. GDPR compliant by design.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 1 — Add the dependency
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61qop6sthyhtd8xfly37.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61qop6sthyhtd8xfly37.jpg" alt=" " width="800" height="1733"&gt;&lt;/a&gt;&lt;br&gt;
dependencies:&lt;br&gt;
  flutter_face_nova:&lt;br&gt;
    git:&lt;br&gt;
      url: &lt;a href="https://github.com/facenova/flutter_face_nova.git" rel="noopener noreferrer"&gt;https://github.com/facenova/flutter_face_nova.git&lt;/a&gt;&lt;br&gt;
  permission_handler: ^11.4.0&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Initialize on startup
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fryuz0gd5bj9nuw9fb16z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fryuz0gd5bj9nuw9fb16z.jpg" alt=" " width="800" height="1733"&gt;&lt;/a&gt;&lt;br&gt;
void main() async {&lt;br&gt;
  WidgetsFlutterBinding.ensureInitialized();&lt;br&gt;
  await FlutterFaceNova.initialize(licenseKey: 'YOUR_LICENSE_KEY');&lt;br&gt;
  await Permission.camera.request();&lt;br&gt;
  runApp(MyApp());&lt;br&gt;
}&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Launch liveness check
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ih6t8wrlq51o4eac4gk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ih6t8wrlq51o4eac4gk.jpg" alt=" " width="738" height="1600"&gt;&lt;/a&gt;&lt;br&gt;
final LivenessResult? result = await FlutterFaceNova.startLiveness(context);&lt;/p&gt;

&lt;p&gt;if (result == null) return; // user cancelled&lt;/p&gt;

&lt;p&gt;if (result.isReal) {&lt;br&gt;
  print('Real face: ${(result.score * 100).toStringAsFixed(1)}%');&lt;br&gt;
} else {&lt;br&gt;
  print('Spoof detected!');&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;That's it. Three steps.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcziprxi7b0xn1priy3se.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcziprxi7b0xn1priy3se.jpg" alt=" " width="738" height="1600"&gt;&lt;/a&gt;&lt;br&gt;
Bonus — Face matching in the same camera session&lt;/p&gt;

&lt;p&gt;final FaceMatchResult? match = await FlutterFaceNova.startLivenessAndMatch(&lt;br&gt;
  context,&lt;br&gt;
  enrolledFaces: myEnrolledFaces,&lt;br&gt;
  matchThreshold: 75.0,&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;if (match != null &amp;amp;&amp;amp; match.isMatch) {&lt;br&gt;
  print('Identity verified: ${match.matchedFace?.name}');&lt;br&gt;
}&lt;/p&gt;




&lt;p&gt;Why FaceNova?&lt;br&gt;
✅ Works offline — Fully functional without an active internet connection.&lt;/p&gt;

&lt;p&gt;✅ No cloud / server — Complete data privacy with zero external dependencies.&lt;/p&gt;

&lt;p&gt;✅ GDPR compliant — Built with privacy-by-design standards.&lt;/p&gt;

&lt;p&gt;✅ Passive execution — Seamless checks with zero mandatory user actions.&lt;/p&gt;

&lt;p&gt;✅ Face matching included — Built-in identity verification alongside liveness scanning.&lt;/p&gt;

&lt;p&gt;✅ Cross-platform — Native performance tailored for Flutter, Android, and iOS.&lt;/p&gt;




&lt;p&gt;Get a free 10-day trial&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://facenova.uk" rel="noopener noreferrer"&gt;https://facenova.uk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No credit card required. Lifetime license from $10 for one app.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>android</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
