I built Reform Proposal Hub for Zukunft-Fabrik.2050 gGmbH to help the client review policy reform proposals. A user uploads a German or English PDF, and the app extracts information from it for review. The user can comment on individual fields before deciding whether to save the proposal.
IResults / Impact
The client can review proposals in a consistent format even when the source documents differ. Once a proposal is saved, its contents can be searched alongside other proposals. The original PDF remains available so people can check the source.
The app handles the initial reading and extraction in the background. A person still reviews the result and decides whether to save it.
IIProblem
The client had long policy proposals in German and English that they wanted to review. Each document presented its case differently. The client needed a consistent way to understand the proposed change and assess the analysis behind it. They also needed to find those details again later.
AI could help extract the information, but its answers needed to be checked. The client needed a review step between the AI result and the saved proposal.
IIIWhat I Owned
I built the flow from PDF upload through review and saving. The UI shows when a document is still being processed. Once the result is ready, the user can inspect the extracted fields and comment on them before saving.
I also built the proposal browser and its search. Each proposal has a detail page with access to the original PDF.
On the backend, I built PDF validation and storage, then connected the upload to background processing and AI extraction. I defined how the extracted information is stored and added full-text search in PostgreSQL. I also worked on the Dockerized deployment to the client’s private server.
IVArchitecture
Uploading a PDF creates a document record and starts a Quartz background job. iText reads the document, and Gemini extracts information into named fields. The backend checks the response before the UI presents it to the user.
The UI checks for the result while processing continues. When it is ready, the user can review the fields and add comments. Saving the proposal makes it available in the searchable collection.
VHard Parts / Tradeoffs
The main challenge was using AI without treating its response as fact. I used focused prompts and parsed the output into defined fields so a person could review each answer in context. The decision to save remained with the user.
PDF reading and AI extraction can take longer than a normal upload request. I moved that work into background jobs and kept the UI updated while it ran. German documents posed another challenge: the extracted information needed consistent English wording while original proposal names remained recognizable.
Search also shaped the database. Keeping the information in separate fields lets people find specific details later instead of relying on a single summary.
VIWhat I Would Improve Next
I would link each extracted field to its location in the PDF. That would make it easier to check an answer against the source. I would also strengthen validation and make failed jobs easier to retry.