{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/2026-09-30-september-release/","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://avniproject.org","twitterHandle":"@avniproject"}},"post":{"id":"2057a16e-429e-51e2-acdc-bb73bfa1aaf9","html":"<h2>Approval and Rejection forms</h2>\n<a href=\"https://github.com/avniproject/avni-product/issues/1901\" target=\"_blank\" style=\"text-decoration: none; color: inherit; display: block; transition: all 0.3s ease;\" onmouseover=\"this.style.opacity=&apos;0.95&apos;; this.style.transform=&apos;translateY(-2px)&apos;; this.style.boxShadow=&apos;0 8px 24px rgba(0,102,204,0.15)&apos;;\" onmouseout=\"this.style.opacity=&apos;1&apos;; this.style.transform=&apos;translateY(0)&apos;; this.style.boxShadow=&apos;none&apos;;\">\n<div style=\"display: flex; gap: 40px; align-items: center; padding: 40px; margin-bottom: 20px; cursor: pointer; background: #ffffff; transition: all 0.3s ease;\">\n    <div style=\"flex: 1; min-width: 250px;\">\n        <img src=\"/static/7667e314ebf035100602a8b4f85b9613/approval-rejection-form-demo.gif\" alt=\"An approver opens a pending record, taps Reject, ticks a reason on the Rejection form, and the reason then appears as a Rejection Note at the top of the record\" style=\"max-height: 420px; width: auto; display: block; margin: 0 auto; 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=\"font-size: 14px; color: #0066cc; font-weight: 600; margin: 0 0 8px 0;\">Turn approval decisions into data you can count</p>\n        <p style=\"margin: 12px 0; line-height: 1.8;\">Rejecting a record used to mean typing a sentence into a comment box. The field worker knew what to fix, but nobody could count those sentences.</p>\n        <p style=\"margin: 12px 0; line-height: 1.8;\">Now an organisation can build an <strong>Approval form</strong> or a <strong>Rejection form</strong> in App Designer. In the mobile app, tapping Approve or Reject opens that form instead of the comment box. The field worker whose record was sent back sees the approver&apos;s answers where the comment used to appear.</p>\n        <p style=\"margin-top: 16px; font-size: 13px; color: #0066cc; font-weight: 600; display: flex; align-items: center; gap: 6px;\">&#x2192; View technical details</p>\n    </div>\n</div>\n</a>\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        <figure class=\"gatsby-resp-image-figure\" style=\"max-width: 369px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 738px; \">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 112.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAXABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAEFAgP/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgH/2gAMAwEAAhADEAAAAfea1hltRTmmqD//xAAbEAABBAMAAAAAAAAAAAAAAAABAAMQFAIEQf/aAAgBAQABBQKo0qjKGk1kOCRH/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFREBAQAAAAAAAAAAAAAAAAAAICL/2gAIAQIBAT8Bof/EABcQAAMBAAAAAAAAAAAAAAAAAAACMSD/2gAIAQEABj8CrFcrb//EABsQAAIDAQEBAAAAAAAAAAAAAAABITFB0RGh/9oACAEBAAE/IWlvGM4O76Lh6CNRnB2kqaxuGigp9P/aAAwDAQACAAMAAAAQz+88/8QAFREBAQAAAAAAAAAAAAAAAAAAICH/2gAIAQMBAT8Qg//EABoRAAICAwAAAAAAAAAAAAAAAAERACEQkeH/2gAIAQIBAT8QIeiNdgavP//EABwQAQADAQEAAwAAAAAAAAAAAAEAESExUUHB8P/aAAgBAQABPxAWWNKtyNa94Aw4DQ/lxiNLvnmxUB8xNgjRuwO7v3EAvc+SOyPZ/9k=&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"A summary screen listing submissions as Approved or Rejected, with the reasons for each rejection shown beside it\" title=\"A summary screen listing submissions as Approved or Rejected, with the reasons for each rejection shown beside it\" src=\"/static/0bc3b2b081040a9053b35426bcdfc7e1/2c956/rejection-reasons-summary%402x.jpg\" srcset=\"/static/0bc3b2b081040a9053b35426bcdfc7e1/36dd4/rejection-reasons-summary%402x.jpg 512w,\n/static/0bc3b2b081040a9053b35426bcdfc7e1/2c956/rejection-reasons-summary%402x.jpg 738w\" sizes=\"(max-width: 738px) 100vw, 738px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">A summary screen listing submissions as Approved or Rejected, with the reasons for each rejection shown beside it</figcaption>\n  </figure>\n    </div>\n    <div style=\"flex: 1; min-width: 250px;\">\n        <p style=\"font-size: 14px; color: #0066cc; font-weight: 600; margin: 0 0 8px 0;\">See why records are sent back</p>\n        <p style=\"margin: 12px 0; line-height: 1.8;\">The answers flow into reports and integrations like any other form data. If the Rejection form asks for the reason as a list of options, a program manager can count how often each reason comes up.</p>\n    </div>\n</div>\n<div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 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;\">Set it up in App Designer</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">Build the form, then attach it to anything that already has approval switched on. Follow the steps in <a href=\"https://avni.readme.io/docs/approval-workflow#approval-and-rejection-forms\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">Approval and rejection forms</a> in the Avni docs.</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;\">Rules work here too</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">The rule builder in App Designer works on Approval and Rejection forms, so you can hide or validate questions without writing code.</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;\">Optional and backward compatible</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">Either form can be attached on its own. Where no form is attached, approving and rejecting work exactly as before.</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;\">Buttons no longer hidden on Android 16</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">On Android 16 phones, buttons at the bottom of the screen, such as Apply on the Filter screen, were drawn underneath the phone's navigation bar and couldn't be pressed. They now sit above it and work again. (<a href=\"https://github.com/avniproject/avni-client/issues/2114\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-client#2114</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;\">Clearer media sync errors</p>\n<p style=\"margin: 0; line-height: 1.7; color: #374151; font-size: 14px;\">When a photo or other media file stopped a sync, field workers saw only an error code. They now see a readable message, and the sync is recorded as failed rather than incomplete, so it's clearer what went wrong. (<a href=\"https://github.com/avniproject/avni-client/issues/2097\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-client#2097</a>)</p>\n</div>\n</div>\n<hr>\n<h2>Performance improvements</h2>\n<div style=\"padding: 0 0 20px 0; background: #ffffff;\">\n    <p style=\"font-weight: 700; margin: 12px 0 8px 0;\">Attendance report refreshes in about a minute, not hours</p>\n    <p style=\"margin: 12px 0; line-height: 1.8;\">For organisations that track attendance, refreshing the attendance report used to take one to two hours. It now takes under a minute and a half. The report's contents are unchanged. (<a href=\"https://github.com/avniproject/avni-etl/issues/175\" target=\"_blank\" style=\"color: #0066cc; font-weight: 500;\">avni-etl#175</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":"September 30, 2026","title":"Avni September Release","author":"Avni Team","description":"Structured Approval and Rejection forms, a fix for hidden buttons on Android 16, clearer media sync errors, and an attendance report that refreshes in about a minute instead of hours. Here's what changed.","tags":["release"],"image":null},"fields":{"slug":"/blog/2026-09-30-september-release/"}}},"pageContext":{"id":"2057a16e-429e-51e2-acdc-bb73bfa1aaf9"}},"staticQueryHashes":["1175525803","4080856488"]}