<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Freelance .NET, Angular, Python and Flutter developer in West Flanders on Rock-IT - Peter Dewachtere - Freelance IT Developer</title><link>https://dewachtere.be/en/</link><description>Recent content in Freelance .NET, Angular, Python and Flutter developer in West Flanders on Rock-IT - Peter Dewachtere - Freelance IT Developer</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 16 Sep 2026 10:03:53 +0200</lastBuildDate><atom:link href="https://dewachtere.be/en/index.xml" rel="self" type="application/rss+xml"/><item><title>Omni-Term B2B webshop</title><link>https://dewachtere.be/en/projects/omni-term-webshop/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://dewachtere.be/en/projects/omni-term-webshop/</guid><description>&lt;p&gt;&lt;a href="https://www.omniterm.be"&gt;Omni-Term&lt;/a&gt;, based in Izegem (Belgium), has been a wholesaler in heating, solar and ventilation since 1970, with several branches and professional installers as its customers. For those installers I build and maintain the B2B webshop &lt;strong&gt;pro.omniterm.be&lt;/strong&gt;: the digital extension of the trade counter, open around the clock.&lt;/p&gt;
&lt;h3 id="the-challenge"&gt;The challenge&lt;/h3&gt;
&lt;p&gt;Installers often order in the evening or from the construction site. They want to know immediately whether an item is in stock at their branch and when they can pick it up or have it delivered. The webshop therefore has to work seamlessly with Omni-Term&amp;rsquo;s ERP system: customer-specific prices, stock per branch, open orders and invoices must always be correct.&lt;/p&gt;</description></item><item><title>BillableMe: work registration for freelancers</title><link>https://dewachtere.be/en/projects/billableme/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://dewachtere.be/en/projects/billableme/</guid><description>&lt;p&gt;As a freelancer I know how tedious it is to reconstruct hours after a long working day, collect receipts and remember the ideas you had on the road. &lt;strong&gt;BillableMe&lt;/strong&gt; is the app I developed for exactly that: everything you do for a client is logged right away on your smartphone, per client and per project.&lt;/p&gt;
&lt;h3 id="what-billableme-does"&gt;What BillableMe does&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hours and activities&lt;/strong&gt;: log work per client, project and activity, with a built-in timer or afterwards, and review it per day, week, month or year&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expenses and travel&lt;/strong&gt;: business expenses and additional costs per registration, with transport types and photos of receipts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI receipt reading&lt;/strong&gt;: a photo of a receipt is read automatically (OCR), so amounts no longer have to be typed in by hand&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice notes&lt;/strong&gt;: record a to-do, reminder or note on the go; the app transcribes it automatically, in Dutch or English, and makes it searchable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure and multilingual&lt;/strong&gt;: biometric sign-in, fully available in Dutch and English, with a backend health check at start-up&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="technology"&gt;Technology&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;App&lt;/strong&gt;: Flutter with Riverpod, GoRouter and Freezed, audio recording and playback, Material Design; tested through TestFlight and coming soon to the App Store and Google Play&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backend&lt;/strong&gt;: NestJS (TypeScript) with TypeORM and PostgreSQL, JWT authentication, Redis and Bull queues for background jobs, audit logging and optimistic locking&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI services&lt;/strong&gt;: a self-hosted Whisper transcription service in Python (FastAPI, CPU-only) and Google Document AI for reading receipts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hosting &amp;amp; DevOps&lt;/strong&gt;: Docker Swarm with multiple API replicas, nginx, a private registry and health checks, hosted by Rock-IT&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="why-an-own-product"&gt;Why an own product?&lt;/h3&gt;
&lt;p&gt;BillableMe grew out of my own daily practice and is used the way a real user uses it. At the same time it is my testing ground for new technology: spec-driven development, AI transcription and document recognition were tried out here first before being used for clients. What works well here also benefits my clients.&lt;/p&gt;</description></item><item><title>POVV DSV Tool: ordering app for members</title><link>https://dewachtere.be/en/projects/povv-dsv-tool/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://dewachtere.be/en/projects/povv-dsv-tool/</guid><description>&lt;p&gt;&lt;a href="https://www.povv.be"&gt;POVV&lt;/a&gt; (Producenten Organisatie Vleesvee) is a Belgian cooperative that supports beef cattle farmers and strengthens their market position. Through POVV, members order cattle feed and other products from several suppliers. To simplify that ordering process I developed the &lt;strong&gt;DSV Tool&lt;/strong&gt;: a mobile app for the members, a web admin panel for the secretariat and a central backend that ties everything together. Rock-IT has been working with POVV since 2021; after the website, this ordering platform followed in 2026.&lt;/p&gt;</description></item><item><title>Kadeo: website for a ceramics studio</title><link>https://dewachtere.be/en/projects/kadeo-website/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://dewachtere.be/en/projects/kadeo-website/</guid><description>&lt;p&gt;&lt;a href="https://katleendeprez.be"&gt;Kadeo&lt;/a&gt; is the ceramics studio of Katleen Deprez. She wanted a website that lets her work speak: calm, warm and visual, with a gallery she can update herself without involving a developer. I designed and built the site from A to Z and host it on Rock-IT&amp;rsquo;s infrastructure.&lt;/p&gt;
&lt;h3 id="the-challenge"&gt;The challenge&lt;/h3&gt;
&lt;p&gt;A portfolio site for an artist is all about imagery. Photos have to load fast, look sharp on every screen and be easy to manage: upload, crop, arrange in sections, done. At the same time the site has to be findable in Google, have a contact form that keeps spam out and comply with cookie legislation. All of that without subscription fees for an external CMS.&lt;/p&gt;</description></item><item><title>Kadeo Photo Uploader: photo app for the studio</title><link>https://dewachtere.be/en/projects/kadeo-photo-uploader/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://dewachtere.be/en/projects/kadeo-photo-uploader/</guid><description>&lt;p&gt;New work comes out of the kiln, the photo is taken with the smartphone&amp;hellip; and then it still has to go to the laptop to be cropped and uploaded. For the ceramics studio &lt;a href="https://katleendeprez.be"&gt;Kadeo&lt;/a&gt; I therefore built a small, focused Flutter app that skips that detour: pick a photo, pick a section, upload. Done.&lt;/p&gt;
&lt;h3 id="the-challenge"&gt;The challenge&lt;/h3&gt;
&lt;p&gt;The &lt;a href="https://dewachtere.be/en/projects/kadeo-website/"&gt;Kadeo website&lt;/a&gt; has a full admin panel, but a browser CMS is cumbersome on a smartphone. The app had to be fast and simple, deliver photos in the right quality automatically, and communicate securely with the website without typing a password every time. Moreover, it did not need to be in the App Store: it only runs on the ceramicist&amp;rsquo;s own iPhone.&lt;/p&gt;</description></item><item><title>MVDM Advocaten: website for a law firm</title><link>https://dewachtere.be/en/projects/mvdm-advocaten/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://dewachtere.be/en/projects/mvdm-advocaten/</guid><description>&lt;p&gt;&lt;a href="https://www.mvdmadvocaten.be"&gt;MVDM Advocaten&lt;/a&gt; is a law firm with offices in Ypres and Brielen (Belgium). I have looked after the firm&amp;rsquo;s website since 2018, initially under the name Onraet-Verfaille. When the firm continued as MVDM Advocaten in the autumn of 2022, the site received a completely new look, with the understated black-and-white photography that is now the firm&amp;rsquo;s calling card.&lt;/p&gt;
&lt;h3 id="the-challenge"&gt;The challenge&lt;/h3&gt;
&lt;p&gt;A law firm wants to radiate trust: sober, professional and above all clear. Visitors quickly look for the answer to three questions: what does this firm do, what does it cost and who are the lawyers? The site also had to be available in Dutch and French, rank well in Google and absorb the name change without losing visitors.&lt;/p&gt;</description></item><item><title>Searching a technical catalogue: Elasticsearch and ETIM at Omni-Term</title><link>https://dewachtere.be/en/blog/etim-zoeken-elasticsearch-omniterm/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://dewachtere.be/en/blog/etim-zoeken-elasticsearch-omniterm/</guid><description>&lt;p&gt;An installer who types &amp;ldquo;pressure gauge 1/2&amp;rdquo; wants one thing: the right article, right away. In the &lt;a href="https://dewachtere.be/en/projects/omni-term-webshop/"&gt;Omni-Term B2B webshop&lt;/a&gt; installers search by article number, supplier code, brand, description or technical feature, across a catalogue from many manufacturers. This is how I built that search.&lt;/p&gt;
&lt;h3 id="one-search-box-many-kinds-of-questions"&gt;One search box, many kinds of questions&lt;/h3&gt;
&lt;p&gt;The query is analysed first. If the code recognises an article number or a supplier code, it goes straight to exact and wildcard matching on those fields, with the highest boost. If it recognises a brand name, products of that brand get priority. Everything else is treated as regular terms, searched across several fields at once: the description as exact keyword, as analysed text and as edge n-gram for prefixes, the product description, and the hierarchy from category down to product family. Searching for an old article number also finds the successor through a nested list of predecessors.&lt;/p&gt;</description></item><item><title>Voice notes with AI: how BillableMe turns audio into text with Whisper</title><link>https://dewachtere.be/en/blog/whisper-spraaknotities-billableme/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://dewachtere.be/en/blog/whisper-spraaknotities-billableme/</guid><description>&lt;p&gt;As a freelancer you get your best ideas in the car or on site, exactly when typing is not an option. That is why &lt;a href="https://dewachtere.be/en/projects/billableme/"&gt;BillableMe&lt;/a&gt; got voice notes: you speak a to-do, reminder or note, and half a minute later the text appears next to it, searchable. This is how I approached it.&lt;/p&gt;
&lt;h3 id="the-requirements"&gt;The requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Audio stays on my own server, without an external transcription service.&lt;/li&gt;
&lt;li&gt;Dutch and English, with automatic language detection.&lt;/li&gt;
&lt;li&gt;No GPU: it has to run on the existing Docker Swarm.&lt;/li&gt;
&lt;li&gt;The user never waits for the transcription.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-1-recording-in-flutter"&gt;Step 1: recording in Flutter&lt;/h3&gt;
&lt;p&gt;The app records with the &lt;code&gt;record&lt;/code&gt; package in AAC (m4a), asks for microphone permission and lets you pick a category, a flag and a title right away. The file goes to the NestJS API as a multipart upload. From that moment the note is visible in the list, with the status &amp;ldquo;processing&amp;rdquo;.&lt;/p&gt;</description></item></channel></rss>