{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/2026-06-30-june-release/","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://avniproject.org","twitterHandle":"@avniproject"}},"post":{"id":"b794eb83-991b-5bc1-b98b-a1980b049a2d","html":"<h2>On-device AI, fully offline</h2>\n<div style=\"display: flex; gap: 40px; align-items: center; padding: 40px; margin-bottom: 20px; background: #ffffff;\">\n    <div style=\"flex: 1; min-width: 250px;\">\n        <img src=\"/static/2e004ef2ec0e7c80ee7949ac1fe6efad/AI_oral_screening_demo.gif\" style=\"width: 100%; height: auto; display: block; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);\">\n    </div>\n    <div style=\"flex: 1; min-width: 250px;\">\n        <p style=\"margin: 12px 0; line-height: 1.8;\">The Android app can now run AI models directly on the phone, with no internet needed. A form can trigger a model on a photo a field worker just took and <strong>automatically fill in the result</strong> &#x2014; even inside repeating sections of a form.</p>\n        <p style=\"margin: 12px 0; line-height: 1.8;\">Less manual entry, fewer errors, in places where connectivity can&apos;t be relied on.</p>\n        <p style=\"margin-top: 16px; font-size: 13px; font-weight: 600;\"><a href=\"https://github.com/avniproject/avni-client/pull/1929\" target=\"_blank\" style=\"color: #0066cc; text-decoration: none;\">&#x2192; View technical details</a></p>\n    </div>\n</div>\n<div style=\"border: none; height: 2px; background: linear-gradient(90deg, transparent, #e0e0e0, transparent); margin: 40px 0;\"></div>\n<h2>Mark attendance directly from the dashboard</h2>\n<div style=\"display: flex; gap: 40px; align-items: center; padding: 40px; margin-bottom: 20px; background: #ffffff;\">\n    <div style=\"flex: 1; min-width: 250px;\">\n        <img src=\"/static/aee962644d705ebcc654847264c7e663/mark-attendance-demo.gif\" style=\"width: 100%; height: auto; display: block; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);\">\n    </div>\n    <div style=\"flex: 1; min-width: 250px;\">\n        <p style=\"margin: 12px 0; line-height: 1.8;\">App Designer now lets you add a <strong>&quot;Mark attendance&quot; card</strong> to any dashboard. Tapping it takes a field worker straight into the attendance sheet &#x2014; no extra navigation needed.</p>\n        <p style=\"margin: 12px 0; line-height: 1.8;\">Administrators pick the Group Subject Type and Attendance Type when setting up the card, keeping it flexible for different programs.</p>\n        <p style=\"margin-top: 16px; font-size: 13px; font-weight: 600;\"><a href=\"https://github.com/avniproject/avni-client/issues/1936\" target=\"_blank\" style=\"color: #0066cc; text-decoration: none;\">&#x2192; View technical details</a></p>\n    </div>\n</div>\n<div style=\"border: none; height: 2px; background: linear-gradient(90deg, transparent, #e0e0e0, transparent); margin: 40px 0;\"></div>\n<h2>Attendance refinements</h2>\n<div style=\"padding: 0 0 20px 0; background: #ffffff;\">\n    <p style=\"margin: 12px 0; line-height: 1.8;\">Several smaller improvements to the attendance flow have landed:</p>\n    <ul style=\"margin: 12px 0; margin-left: 20px; line-height: 1.8;\">\n        <li><strong>Multiple absence reasons</strong> can now be selected at once</li>\n        <li>A separate <strong>\"needs follow-up\" checkbox</strong>, independent of the absence reason</li>\n        <li>A clearer reason shown when <strong>someone is removed from a group</strong></li>\n        <li><strong>Student names sorted alphabetically</strong> in the attendance view</li>\n        <li>A tidier attendance list overall</li>\n    </ul>\n    <p style=\"margin-top: 16px; font-size: 13px; font-weight: 600;\"><a href=\"https://github.com/avniproject/avni-server/issues/1002\" target=\"_blank\" style=\"color: #0066cc; text-decoration: none;\">→ View technical details</a></p>\n</div>\n<div style=\"border: none; height: 2px; background: linear-gradient(90deg, transparent, #e0e0e0, transparent); margin: 40px 0;\"></div>\n<h2>Import cancelled visits and exited enrolments</h2>\n<div style=\"display: flex; gap: 40px; align-items: center; padding: 40px; margin-bottom: 20px; background: #ffffff;\">\n    <div style=\"flex: 1; min-width: 250px;\">\n        <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 843px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 46.875%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABa0lEQVQoz22QzUrDQBDH80jeLHjxIPoYvlD7BIJF0PbioXoSTz0IQqVQEBH1oKapSdrdTXazH8l+JE6SWj/wxzAsw87/PzPe/hk9GLBOn24f/xO7p2xvkEHu9NnOSbZ1lB5eZGVZAZC8h9foOcAvCzLHcpGogCjIH22k+XCCutfh8A6/xfTxPZ5jgbmpvvDQapkQoqR01oHcCpN5EMTxklJWFMX5rd+9fLq6T4oipwlx1taezpUNXhgtk5QKqfLCFNouiFggDvKEG13LrSmbWV1ZGWO/ncMwIiQRQkJVa4OoTHlBeS5y0y5mXenKdX9LEARRFMFc0BwihDgXWmtwxmmW0ZRRKkFPyjzP4be11phaCyq9Xm82m2GMOedeHMcIYUwIgyW1yZRRTY82Br4KIabT6U3DZDIZj8ej0WizhRdF0IwYY+AEY1e/cc7BkPMGePi+r5Rq6/XB4LDgu1ohOC+sDYqt6kb+Dz+Ln1Dk6/x7fLF3AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"import cancelled visits\" title=\"import cancelled visits\" src=\"/static/32e4d7cc01f0d224c39a5d2ce3b2e055/4ff83/import-cancelled-visits.png\" srcset=\"/static/32e4d7cc01f0d224c39a5d2ce3b2e055/01e7c/import-cancelled-visits.png 512w,\n/static/32e4d7cc01f0d224c39a5d2ce3b2e055/4ff83/import-cancelled-visits.png 843w\" sizes=\"(max-width: 843px) 100vw, 843px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n    </div>\n    <div style=\"flex: 1; min-width: 250px;\">\n        <p style=\"margin: 12px 0; line-height: 1.8;\">Two new import modes let you bring <strong>historical visit cancellations</strong> and <strong>enrolment exits</strong> into Avni through bulk upload, instead of entering them one by one. Particularly useful when migrating from paper or a legacy system.</p>\n        <p style=\"margin-top: 16px; font-size: 13px; font-weight: 600;\"><a href=\"https://github.com/avniproject/avni-server/issues/988\" target=\"_blank\" style=\"color: #0066cc; text-decoration: none;\">&#x2192; View technical details</a></p>\n    </div>\n</div>\n<div style=\"border: none; height: 2px; background: linear-gradient(90deg, transparent, #e0e0e0, transparent); margin: 40px 0;\"></div>\n<h2>Pull in read-only photos and files from earlier forms</h2>\n<div style=\"display: flex; gap: 40px; align-items: center; padding: 40px; margin-bottom: 20px; background: #ffffff;\">\n    <div style=\"flex: 1; min-width: 250px;\">\n        <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 697px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 102.34375%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACKUlEQVQ4y52SzYtSYRTGb7RtEShISz82ooypKPoX+Ce4CMKVbdq0C4KgkGpjH0ythrDljGPgMEXjOKNDZYtGbBHeLAMRveHnvdOIH/drbo/v6+g4MeH0Qw7nXt/nPc859zBHBE3TwuHw0tKS1WpFvEpwOp3IHQ4HcpfLZbfbzWazxWIxmUyBQMDtdjNTcSgUwlGj0Yi3Xq/X7/f7fD7obTYbosfjwS06nc5gMOj1+mAwiLsYyKg4l8vFYrFEIrFOiMfjyWQym81mMpldApK9Y1KpVDqdHospg8Gg1Wp1u12e5wVBaLfbvV5POxtVVZmTD7CgEhRFoXFEEEXxVIJ/UWwmRp1Go9FsNjudDiLNUZ9G2MEb+KLucB4XTXoG/X4fh3CrthgT8dQ2lLB6tAATsSRJ1Wq1UCjA3nTyi1Y+JKCl1bW1SCSCfuioKehTluV/2abVKj/Ly0+iMALnEgEynDjLy1hMPo+Ch89vN9af3R+IowXNz1VutVssy8qKoi02MEx3Jq79KH3a2pBIh+eojI+EuJ/ZfvnozkgSzyc+yd8OsbSyqp76YRmG1Pb/MVd5OBxiq7G6tVqtXq9zHIfl7gsHea52ffdNOPvu5vvtWx93EG/sbV1Lb77+XpwNDKtSqVTK5XI+n98nsKUSz/1a/fqFeXrvwvMHl1ceX3m1fGklevHFQyZ69/aHnbndpruhHDPOJflQHBX5zjehy/IdJCzfRl4Uutzvgz8bfBV6vyWw7AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"read only media\" title=\"read only media\" src=\"/static/a2f6d0131e1f2e1e2f5d9865d1fdc423/7422e/read-only-media.png\" srcset=\"/static/a2f6d0131e1f2e1e2f5d9865d1fdc423/01e7c/read-only-media.png 512w,\n/static/a2f6d0131e1f2e1e2f5d9865d1fdc423/7422e/read-only-media.png 697w\" sizes=\"(max-width: 697px) 100vw, 697px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n    </div>\n    <div style=\"flex: 1; min-width: 250px;\">\n        <p style=\"margin: 12px 0; line-height: 1.8;\">A form can now <strong>display a photo or document uploaded in an earlier form</strong> &#x2014; the same way it already surfaces other read-only data. Useful when a later step in a workflow needs to reference something captured earlier.</p>\n        <p style=\"margin-top: 16px; font-size: 13px; font-weight: 600;\"><a href=\"https://github.com/avniproject/avni-product/issues/1866\" target=\"_blank\" style=\"color: #0066cc; text-decoration: none;\">&#x2192; View technical details</a></p>\n    </div>\n</div>\n<div style=\"border: none; height: 2px; background: linear-gradient(90deg, transparent, #e0e0e0, transparent); margin: 40px 0;\"></div>\n<h2>Group permission dependencies now cascade automatically</h2>\n<div style=\"display: flex; gap: 40px; align-items: center; padding: 40px; margin-bottom: 20px; background: #ffffff;\">\n    <div style=\"flex: 1; min-width: 250px;\">\n        <img src=\"/static/32e97390130e957bef10625da6f05b0c/permission-cascade-demo.gif\" style=\"width: 100%; height: auto; display: block; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);\">\n    </div>\n    <div style=\"flex: 1; min-width: 250px;\">\n        <p style=\"margin: 12px 0; line-height: 1.8;\">When setting up user group permissions, enabling or disabling one permission now automatically adjusts all related permissions through the full dependency chain. For example, enabling <strong>&quot;Add Member&quot;</strong> automatically enables <strong>&quot;View Subject&quot;</strong>; disabling &quot;View Subject&quot; disables all downstream permissions like <strong>&quot;Schedule Visit&quot;</strong> or <strong>&quot;Perform Visit&quot;</strong>.</p>\n        <p style=\"margin-top: 16px; font-size: 13px; font-weight: 600;\"><a href=\"https://github.com/avniproject/avni-webapp/issues/1764\" target=\"_blank\" style=\"color: #0066cc; text-decoration: none;\">&#x2192; View technical details</a></p>\n    </div>\n</div>\n<hr>\n<h2>Minor enhancements</h2>\n<div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 20px;\">\n<div style=\"padding: 20px; border: 1px solid #e5e7eb; border-radius: 8px;\">\n<p style=\"font-weight: 700; margin: 0 0 8px 0;\">Do visit card shows multiple enrolments</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">Individuals enrolled in more than one program now appear correctly in the Do visit card. (<a href=\"https://github.com/avniproject/avni-client/issues/1937\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-client#1937</a>)</p>\n</div>\n<div style=\"padding: 20px; border: 1px solid #e5e7eb; border-radius: 8px;\">\n<p style=\"font-weight: 700; margin: 0 0 8px 0;\">Registration decisions visible on web</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">Admins can now see registration decisions directly in the Data Entry App. (<a href=\"https://github.com/avniproject/avni-webapp/issues/1554\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-webapp#1554</a>)</p>\n</div>\n<div style=\"padding: 20px; border: 1px solid #e5e7eb; border-radius: 8px;\">\n<p style=\"font-weight: 700; margin: 0 0 8px 0;\">Duplicate syncs prevented</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">Tapping sync multiple times no longer triggers duplicate manual sync operations. (<a href=\"https://github.com/avniproject/avni-client/issues/1792\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-client#1792</a>)</p>\n</div>\n<div style=\"padding: 20px; border: 1px solid #e5e7eb; border-radius: 8px;\">\n<p style=\"font-weight: 700; margin: 0 0 8px 0;\">CSV error files easier to download</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">Analytics permission is no longer needed to download error files from a bulk upload. (<a href=\"https://github.com/avniproject/avni-server/issues/999\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-server#999</a>)</p>\n</div>\n</div>\n<hr>\n<h2>Performance improvements</h2>\n<div style=\"padding: 0 0 20px 0; background: #ffffff;\">\n<h3>Subject search is fast again</h3>\n<p>A slow database query was causing subject searches with filters to take 50–70 seconds — the root cause behind the response-time slowdown some teams noticed in May. It's now fixed. (<a href=\"https://github.com/avniproject/avni-server/issues/1005\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-server#1005</a>)</p>\n<h3>One less filter, one faster tap</h3>\n<p>The individual filter on the \"Do visit\" action card has been removed, making that flow quicker to use. (<a href=\"https://github.com/avniproject/avni-client/issues/1911\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-client#1911</a>)</p>\n</div>\n<hr>\n<h3>Share Feedback and Stay Updated!</h3>\n<p>Join our <a href=\"https://discord.gg/VRZQYdcyuG\">Avni community on Discord</a> to share your thoughts, ask questions, and get the latest updates.</p>\n<p>Need a walkthrough or have questions? Feel free to <a href=\"https://avniproject.org/\">schedule a demo call here</a>.</p>","frontmatter":{"date":"June 30, 2026","title":"Avni June Release","author":"Avni Team","description":"On-device AI for field workers, attendance flow improvements, and a faster data pipeline. Here's what changed and what it means for you.","tags":["release"],"image":null},"fields":{"slug":"/blog/2026-06-30-june-release/"}}},"pageContext":{"id":"b794eb83-991b-5bc1-b98b-a1980b049a2d"}},"staticQueryHashes":["1175525803","4080856488"]}