[{"data":1,"prerenderedAt":332},["ShallowReactive",2],{"footer-vacatures-en":3,"case-omgevingsalert-data-bruikbaar-maken-en":4,"content-by-keys-useCases-en-eigen-data-en-kennis-gebruiken-met-ai,ai-toevoegen-aan-bestaande-software":172},[],{"id":5,"title":6,"approach":7,"body":22,"build":29,"card":42,"connections":47,"cta":48,"dataExamples":47,"description":26,"extension":54,"facts":55,"featured":70,"guardrails":47,"hero":71,"integrations":47,"key":76,"meta":77,"navigation":78,"offers":79,"order":89,"path":90,"proof":91,"relations":104,"result":122,"seo":134,"situation":137,"stem":150,"summary":151,"usecases":152,"visuals":164,"__hash__":171},"cases_en\u002Fcases\u002Fomgevingsalert-data-bruikbaar-maken.md","OmgevingsAlert: from scattered data to relevant alerts",{"title":8,"steps":9},"How did we approach it?",[10,13,16,19],{"title":11,"text":12},"Retrieve every source reliably","For each source we built the right integration: scheduled imports, API connections, XML processing, RSS and HTML imports and processes that continuously listen to live data streams. Import work runs asynchronously so large or slow sources do not block the rest of the product.\n",{"title":14,"text":15},"Translate everything into one shared model","Source records keep their own specific information, but are then indexed into a shared Feature model. This means apps and other consumers do not need to understand how a KNMI warning, announcement or public transport message was originally delivered.\n",{"title":17,"text":18},"Geography at the core","With PostgreSQL and PostGIS we link points, areas and other geometry to the locations users follow. Assets can be, for example, addresses, points, polygons or imported KML areas.\n",{"title":20,"text":21},"Only then decide what is relevant","After the geographic selection we apply filters on, among other things, category, distance, words that must appear and words that must be excluded. Only relevant combinations are linked to a user's inbox.\n",{"type":23,"value":24,"toc":25},"minimark",[],{"title":26,"searchDepth":27,"depth":27,"links":28},"",2,[],{"title":30,"intro":31,"points":32},"What did we build?","The core is a data platform that reduces very different sources to one usable stream of local information. On top of that sit matching, filtering, notifications and several product interfaces.\n",[33,36,39],{"title":34,"text":35},"A broad import layer","The platform processes, among other things, official publications, zoning plans, police reports, KNMI weather warnings, NDW roadworks, NDOV disruptions, local news, earthquakes and municipalities' own messages.\n",{"title":37,"text":38},"One normalised Feature pipeline","Every source is translated into shared fields such as category, publication date, geometry, source information and the parts needed to show the message in the different products. New source types therefore do not have to be implemented separately in every client again.\n",{"title":40,"text":41},"A geographic matching engine","New data is linked to relevant locations and objects. For consumers that can be a point with a radius; professional users can also monitor larger areas or their own geometry. Matching for larger numbers of assets is processed in batches to keep the background queues manageable.\n",{"tag":43,"title":44,"summary":45,"metric":46},"Data platform","OmgevingsAlert: from scattered data to relevant notifications","A wide range of public and live data sources are imported, normalised and linked geographically before being turned into relevant information for the right user.","Since 2012 · from government XML to live public transport feeds.",null,{"title":49,"body":50,"primaryCta":51,"secondaryCta":52,"local":53},"Plenty of data, but no usable system yet?","Show us where the information comes from and what eventually needs to happen with it. We help set up the data flow so that other software can reliably build on it.\n","Book a call","View offer","Senior AI and software engineering from Delft, for organisations in Delft, The Hague, Rotterdam and the surrounding area.\n","md",{"title":56,"items":57},"The case in brief",[58,61,64,67],{"label":59,"value":60},"Product","In development since 2012",{"label":62,"value":63},"Data sources","From government XML to live public transport feeds",{"label":65,"value":66},"Matching","Geographic and content-based per location",{"label":68,"value":69},"Output","Apps, dashboard, website, push and email",false,{"headline":72,"intro":73,"primaryCta":74,"secondaryCta":75},"Collecting data is easy. Working out which piece matters to whom is the real work.","OmgevingsAlert started in 2012 with a simple idea: choose a location and receive relevant permits and spatial developments in the neighbourhood. Today the platform processes many more kinds of information. Every source has its own format, rhythm, quality and geographic logic. Most of the engineering is in everything that has to happen before you can show any data.\n","See how the data flow works","Tell us what you want to build","omgevingsalert-data-bruikbaar-maken",{},true,{"eyebrow":80,"primary":81},"Matching offer",{"key":82,"title":83,"text":84,"price":85,"result":86,"duration":87,"nextStep":88},"build-integrate","Build & Integrate","We build the technical layer between your data sources and the product that has to work with them: imports, API connections, normalisation, processing, matching and reliable integrations.\n","Fixed price after scoping","A production-ready data flow integrated into your software","Depends on scope","First we map sources, volumes, processing and the desired output",3,"\u002Fcases\u002Fomgevingsalert-data-bruikbaar-maken",{"title":92,"intro":93,"points":94},"The complexity is under the hood","OmgevingsAlert shows well why data engineering is more than reading an API and storing records. The value only emerges when unreliable, changing and dissimilar input can move safely through a complete production chain.\n",[95,98,101],{"title":96,"text":97},"Batch, real-time and periodic side by side","One source is checked daily, police data every ten minutes and public transport messages arrive through a permanently listening pub\u002Fsub process. The backend has to process all these forms reliably side by side.\n",{"title":99,"text":100},"PostGIS decides what is relevant where","Features and assets contain real geometry. Matching uses spatial calculations, distance rules and area relations instead of just textual place names or postcodes.\n",{"title":102,"text":103},"The pipeline does not end at storage","Import is followed by normalisation, matching, filtering, inbox status, access rules and notification. Push can be sent immediately or bundled, and Pro users can receive relevant alerts via an email digest.\n",{"buyerTriggerKeys":105,"useCaseKeys":107,"offerKeys":110,"solutionKey":111,"capabilityKeys":112},[106],"ai-laten-bouwen",[108,109],"eigen-data-en-kennis-gebruiken-met-ai","ai-toevoegen-aan-bestaande-software",[82],"omgevingsalert",[113,114,115,116,117,118,119,120,121],"software-engineering","backend-engineering","data-engineering","integrations","geospatial","postgresql","postgis","background-processing","api-engineering",{"title":123,"items":124},"What does it deliver?",[125,128,131],{"title":126,"text":127},"One product on top of completely different data sources","To the user, a permit, a road closure or a weather warning feels like the same kind of product experience, while the underlying sources technically have little in common.\n",{"title":129,"text":130},"From national data to personal relevance","The backend translates large streams of general information into a much smaller selection per location. Users do not have to search government sites, news feeds and traffic sources themselves.\n",{"title":132,"text":133},"A foundation we can keep building on","New categories can use the same import, normalisation, matching and notification infrastructure. On that basis we later also added AI filters that can judge, for certain workflows, whether an alert is relevant in terms of content.\n",{"title":135,"description":136},"OmgevingsAlert: bringing complex data sources together | 9to5 software","Case: how 9to5 software imports, normalises, geographically matches and makes available a wide range of public and live data sources for OmgevingsAlert in apps, dashboards and notifications.\n",{"title":138,"intro":139,"points":140},"Where is the complexity?","The user only wants to know one thing: what is happening around me that matters to me? Behind that simple question is a data platform in which information from different organisations, protocols and formats has to come together.\n",[141,144,147],{"title":142,"text":143},"Every source works differently","Official publications come from mutation-event XML and metadata, roadworks from a gzipped DATEX feed, public transport disruptions via a continuous ZeroMQ pub\u002Fsub channel, weather warnings via KNMI open data and local news via RSS, Atom or HTML. So there is no such thing as one generic importer.\n",{"title":145,"text":146},"Source data does not say who it is relevant to","A permit, traffic measure or warning may be available nationwide, but a user only wants information for their own home, neighbourhood, route or managed property. For that, the data needs reliable geographic information and then has to be matched against locations and areas.\n",{"title":148,"text":149},"The same data has to work in several places","The normalised information is used by the mobile apps, Mijn OmgevingsAlert, OmgevingsAlert Pro, the public website and OverUwBuurt. The same backend also drives push notifications, email digests and other product flows.\n","cases\u002Fomgevingsalert-data-bruikbaar-maken","OmgevingsAlert brings a wide range of public and live data sources together in one product. Official announcements, zoning plans, police reports, weather warnings, roadworks, public transport disruptions, local news and other sources all arrive differently. We built the backend that imports this data, normalises it, links it geographically to locations and ultimately delivers only the relevant information to the right user.\n",{"title":153,"items":154},"Where is this relevant?",[155,158,161],{"title":156,"text":157},"We have lots of data, but cannot turn it into a usable product yet","The information sits in different sources, formats and systems and has to be brought together before users can do anything with it.\n",{"title":159,"text":160},"Our data needs to be linked to locations or other context","Just storing the records is not enough. The system must be able to determine which information is relevant to which customer, location, object or process.\n",{"title":162,"text":163},"We want to add new sources without rebuilding the whole product","A good normalisation layer prevents every new integration from requiring changes in all apps, dashboards and other consumers again.\n",{"hero":165,"situation":166,"approach":167,"build":168,"proof":169,"teaser":170},"\u002Fmedia\u002Fscreenshots\u002Fomgevingsalert-hero.webm","\u002Fmedia\u002Fproducts\u002Fomgevingsalert-sources.webp","ls-route-converge","\u002Fmedia\u002Fscreenshots\u002Fomgevingsalert-map.webp","\u002Fmedia\u002Fscreenshots\u002Fomgevingsalert-notifications.webp","\u002Fmedia\u002Fscreenshots\u002Fomgevingsalert-teaser.webm","5tcmk_JIpVjwxiJRbyubwU5fpZtzx4NXZRmSGGAEO1g",[173,254],{"id":174,"title":175,"body":176,"description":26,"desiredOutcome":180,"extension":54,"hero":192,"key":108,"meta":194,"navigation":78,"path":195,"problem":196,"proof":208,"recognition":220,"recommendedApproach":235,"relations":237,"seo":244,"stem":247,"summary":248,"visuals":249,"__hash__":253},"useCases_en\u002Fuse-cases\u002Feigen-data-en-kennis-gebruiken-met-ai.md","Make your own documents, data and knowledge usable for AI",{"type":23,"value":177,"toc":178},[],{"title":26,"searchDepth":27,"depth":27,"links":179},[],{"intro":181,"items":182},"You want to give AI access to relevant information of your own without putting everything into one uncontrollable data bin.\n",[183,186,189],{"title":184,"text":185},"Relevant information at the right moment","The AI only gets the context needed for the current task.\n",{"title":187,"text":188},"Sources stay traceable","Important output can be traced back to the underlying information.\n",{"title":190,"text":191},"Permissions and freshness stay intact","Users only see what they are allowed to see, and changes in sources can carry through into the solution.\n",{"intro":193},"A language model doesn't know your organisation by itself. If AI has to work with your own documents, product data or internal knowledge, that information has to be made available at the right moment and with the right permissions.\n",{},"\u002Fuse-cases\u002Feigen-data-en-kennis-gebruiken-met-ai",{"intro":197,"causes":198},"\"Giving our own data to AI\" sounds like one technical step, but usually consists of selection, retrieval, permissions and quality control.\n",[199,202,205],{"title":200,"text":201},"More context is not automatically better","A model actually gives worse answers when too much irrelevant information is included.\n",{"title":203,"text":204},"Sources have different structures","A PDF, a relational database and a ticketing system each call for a different approach.\n",{"title":206,"text":207},"Data permissions don't disappear with AI","Retrieval has to respect the same access that applies elsewhere in the organisation.\n",{"intro":209,"points":210},"The quality of an AI solution is often determined more by the context you provide than by the newest model. That's why we treat retrieval and data integration as fully-fledged engineering.\n",[211,214,217],{"title":212,"text":213},"Source and use case belong together","We don't just index everything because we can.\n",{"title":215,"text":216},"Existing permissions stay in charge","AI must not become a way around the access model.\n",{"title":218,"text":219},"No unnecessary platform layer","We only choose technical components the real problem requires.\n",{"intro":221,"signals":222},"This question arises when general AI works well, but business-specific context is missing.\n",[223,226,229,232],{"title":224,"text":225},"Knowledge is spread across many sources","Documents, databases and other systems each hold part of the context.\n",{"title":227,"text":228},"Copying into a prompt doesn't scale","Adding information by hand works for a demo, but not for structural use.\n",{"title":230,"text":231},"Information changes regularly","A static dataset quickly becomes outdated.\n",{"title":233,"text":234},"Not all knowledge is for everyone","Access rules from existing systems have to be preserved.\n",{"intro":236},"With Build & Integrate we build the technical layer that gives AI targeted access to your data and knowledge. If feasibility or answer quality is still uncertain, an AI Prototype Sprint can first validate the most important sources and use case.\n",{"buyerTriggerKeys":238,"primaryOfferKey":82,"offerKeys":239,"caseKeys":241,"relatedUseCaseKeys":242},[106],[82,240],"ai-prototype-sprint",[],[243,109],"interne-ai-assistent-laten-ontwikkelen",{"title":245,"description":246},"Use your own data and knowledge with AI | 9to5 software","Put your own documents and databases to work with AI? 9to5 builds RAG, retrieval, integrations and AI workflows around your existing information.\n","use-cases\u002Feigen-data-en-kennis-gebruiken-met-ai","The valuable information is already there. Now AI has to be able to work with it reliably, securely and practically.\n",{"hero":250,"problem":251,"proof":252},"sq-knowledge-filter","sq-connect-nodes","ls-system-connect","rQE5CNfHzt2_sDfHXKyafJGMwiRmtAudJssA1bEegxQ",{"id":255,"title":256,"body":257,"description":26,"desiredOutcome":261,"extension":54,"hero":273,"key":109,"meta":275,"navigation":78,"path":276,"problem":277,"proof":289,"recognition":301,"recommendedApproach":316,"relations":318,"seo":324,"stem":327,"summary":328,"visuals":329,"__hash__":331},"useCases_en\u002Fuse-cases\u002Fai-toevoegen-aan-bestaande-software.md","Add AI to existing software, an app or SaaS",{"type":23,"value":258,"toc":259},[],{"title":26,"searchDepth":27,"depth":27,"links":260},[],{"intro":262,"items":263},"The new AI functionality should feel like part of the product, not like a chatbot glued on later.\n",[264,267,270],{"title":265,"text":266},"AI fits the existing user flow","The feature supports what users are already trying to do.\n",{"title":268,"text":269},"The existing architecture stays manageable","AI is integrated without needlessly adding a second technical world.\n",{"title":271,"text":272},"Production risks are covered","Costs, latency, errors and uncertain model behaviour get a place in the design.\n",{"intro":274},"You don't need to build a completely new AI product. Often most of the value lies in one smart feature inside software users already know. We make sure that feature fits the existing product technically.\n",{},"\u002Fuse-cases\u002Fai-toevoegen-aan-bestaande-software",{"intro":278,"causes":279},"Integrating a standalone AI API is easy. Designing AI as a reliable part of existing product software is another story.\n",[280,283,286],{"title":281,"text":282},"Existing software already has rules","Data, permissions, business logic and user expectations are largely fixed.\n",{"title":284,"text":285},"AI introduces other failure modes","Latency, incorrect output and variable costs have to be handled in existing flows.\n",{"title":287,"text":288},"The new feature can end up too detached","A separate AI system quickly leads to duplicated data and logic.\n",{"intro":290,"points":291},"Understanding and extending existing software is a big part of our work. So AI doesn't need a greenfield to be built well.\n",[292,295,298],{"title":293,"text":294},"Understand the existing architecture first","We design the AI feature around what already works.\n",{"title":296,"text":297},"Integration over isolation","Data, auth and business logic are not duplicated unnecessarily.\n",{"title":299,"text":300},"Production from the design onwards","Reliability and operational consequences count before the feature goes live.\n",{"intro":302,"signals":303},"The problem is usually not how to call a model, but how the new functionality should relate to the existing product.\n",[304,307,310,313],{"title":305,"text":306},"The feature needs existing product data","AI has to work with users, documents or other information already in the product.\n",{"title":308,"text":309},"Permissions must simply keep working","AI must not suddenly expose information or actions that are protected elsewhere.\n",{"title":311,"text":312},"The existing UX should stay in charge","Users want a better workflow, not necessarily a chat interface.\n",{"title":314,"text":315},"You don't want to rebuild the current product","The AI layer has to connect to what already works well technically.\n",{"intro":317},"With Build & Integrate we add the AI functionality to the existing codebase and systems in a targeted way. When the new component is technically risky or still uncertain in substance, an AI Prototype Sprint can first prove the core.\n",{"buyerTriggerKeys":319,"primaryOfferKey":82,"offerKeys":320,"caseKeys":321,"relatedUseCaseKeys":322},[106],[82,240],[],[323,108],"agentic-workflows-bestaande-software",{"title":325,"description":326},"Add AI to existing software or SaaS | 9to5 software","Add AI features (ChatGPT, Claude, OpenAI API) to existing software? 9to5 designs, builds and integrates AI into existing apps and SaaS products.\n","use-cases\u002Fai-toevoegen-aan-bestaande-software","The product already exists. Now you want to add AI functionality without losing sight of the existing architecture, user experience and reliability.\n",{"hero":251,"problem":330,"proof":252},"sq-foundation-build","uIjq2lxyg3PeXyGhq82YeTX4j_ALcHznMSqDHe95r9k",1792049913080]