Johan Ronsse

  • Home
  • Projects
  • Blog
  • Baby op de arm

    August 31, 2025 - Posted in accessibility lifelog nederlands

    Er is die bekende graphic van Microsoft dat we toch allemaal ook tijdelijk een beperking kunnen hebben.

    Je kan bijvoorbeeld maar 1 arm hebben omdat je maar 1 arm hebt, je arm hebt gebroken – of ook omdat je een baby op de arm hebt.

    Dat is nu exact de situatie waar ik mij in bevind deze ochtend. Een baby op de arm, flesje in de hand, zondagochtend, geen zin om nóg eens passief YouTube te kijken.

    Ik ben dan maar in de settings van iOS gegaan om de tutorial rond voice dictation/voice control te lezen.

    Ik gebruikte de dictatie feature al regelmatig om berichten te dicteren. Soms de native feature en soms via Wispr Flow.

    Maar nu dus een nieuw element: via voice control kan ik mijn iPad met mijn stem bedienen.

    In mijn beperkte ervaring werkte dit redelijk goed om de kranten te lezen. De Standaard en De Tijd kon ik goed lezen door tegen mijn iPad mini “scroll up”, “scroll down” en dergelijke te zeggen.

    Een blog post schrijven ging wat minder goed.

    Maar voor iemand die graag gestimuleerd is en dus bored wordt van een 20 minuten een flesje geven, is dit een goede ontdekking: ik kan de krantensites lezen tijdens flesje geven.

    Het is tegelijk professioneel ook een goede ontdekking om de accessible names op knoppen die enkel een icoon hebben na te kijken met een eenvoudig stemcommando.

    Nu hoop ik dat niemand mij hier komt betichten om niet 100% aandacht aan mijn kind te geven. Ik hou van mijn kind, het is een schatje, maar ik denk dat elke ouder de inherente saaiheid van een newborn wel snapt.

  • From a revenue goal to a profit goal

    August 25, 2025 - Posted in bootstrap entrepreneurship

    I’ve read the phrase “revenue is vanity, profit is sanity” and that triggered me to write this post.

    Up until 2 weeks ago I had been chasing a specific revenue goal for the first year of Obra.

    The theory was that if we hit a certain growth stride and headcount, we would be set up for the future.

    As the founder, I could sacrifice my own wage for long-term growth.

    But recently, running the numbers, I believe that creates a problem. Not having profit affects my own motivation. Not enough profit also affects cashflow in general.

    I decided to turned the revenue goal I had into a profit goal. The only way we will last as a company is if we are profitable from the start.

    The next few months, I aim to be working much more in the company then on the company.

    In other words, it’s time to make some money working on projects instead of too much marketing, pseudo-sales and tinkering with too many side projects.

    With Obra Studio we help software companies reach the next design level. We help startups validate their ideas, and scale-ups to build design systems that scale with their businesses.

  • Optimally presenting Figma-based designs with SwitchResX and the right shortcuts

    August 22, 2025 - Posted in figma workflow

    This is one of those nerdy things that I keep coming back to.

    In this remote world, we are often screen sharing designs. I believe you need to be accutely aware of how the other side is receiving your output.

    Next to making sure you output good sound (a good microphone helps) and while presenting, being wary of not too much “swaying” around, there is one thing that is not that apparent, until you see it on the receiving side. That thing is how your own screen resolution affects how you are able to present designs.

    Basically, many designers work on a 27″ desktop screen. If you present directly from a 27″ screen without doing anything specific, the other party is going to have a hard time seeing things from their laptop. The same counts for recording screencasts.

    This topic is top of mind because I’ve been recording some videos for the shadcn/ui docs.

    So how do you find a good middle ground?

    I use this macOS app called SwitchResX which allows you to bind a resolution switch to hotkeys.

    I bound the regular resolution of my 27-inch display to F16. This creates the visual equivalent of 2560×1440 (even though the display is actually 4K). I use this when doing actual design work and working.

    But when I have a meeting, or I am recording a screencast, I like to hit F17, which I bound to setting up the display for the visual equivalent of 1920×1080. This makes it much clearer to the viewer what is going on.

    I also give workshops about Figma often. When screen sharing an app like Figma, and discussing the intricacies of the UI, it makes a world of difference to the viewer that the controls are slightly bigger.

    The receiving side might be on a laptop, watching your screen share in a Google Meet meeting, already reducing the visible size once again.

    Depending on what you are doing, there’s more you can do:

    • For presenting designs: You can hide the Figma UI using ⌘+/ and use N or ⇧+N to jump between designs
      • Jumping between designs helps create a static image that then has time to get uploaded, for clarity on the other side – swaying around too much while sharing creates a blurry image when network conditions are bad
    • You can zoom completely into specific frames using ⇧+2 to Zoom to Selection
    • For talking about Figma itself: you can also change the size of the Figma UI itself. There’s a shortcut for this: ⌥⌘⇧+ or ⌥⌘⇧-.

    I hope this helps someone in their workflow to present designs in a smoother way!

  • Op en neer

    August 20, 2025 - Posted in agency-life obra-studio

    We gaan bijna onze negende maand in als agency.

    En ik stond weer voor een moeilijke keuze: iemand aannemen, super veelbelovend, maar toch telkens een beetje een risico – of kiezen voor stabiliteit.

    Normaal gezien zou ik een risico nemen, maar de nachten zijn kort en de dagen onderbroken.

    Als nieuwe papa is het zoeken naar een nieuw ritme.

    Daarnaast zal het toch nog hard werken zijn om voor dit jaar als bedrijf toch ietwat betere punten te halen: de omzet en de klanten zijn er wel, maar er zijn voorlopig te veel kosten, en te weinig marge.

    Dus, met bovenstaande in het achterhoofd, is de keuze stabiliteit geworden. Ik kies ervoor om met iemand samen te werken waar ik echt op kan rekenen. Welkom in het team, Marina! Of welkom terug moet ik misschien zeggen: Marina was onze eerste werknemer bij Mono.

    Er was deze week ook een ander de-cirkel-is-rond moment: iemand die ik ooit opgeleid heb, kwam nu terug met projectwerk.

    Ik denk eraan om in oktober nog eens hallo te komen zeggen in België. Een plan wordt gevormd. Misschien naar een conferentie; misschien een dineetje met collega’s. Maar sowieso trots de nieuwe spruit aan familie tonen.

  • Omgekeerd

    August 2, 2025 - Posted in agency-life

    De laatste dagen heb ik zitten werken aan het herinterpreteren van een vibe-coded prototype naar een wireframe. Een beetje omgekeerd werken dan anders dus.

    Maar het is leuk en spannend: het project team zit goed met slimme mensen, ik leer veel bij over het onderwerp van de app – sales – en het project heeft een stevig tempo.

    Ik ben ook blij dat we in de zomermaanden een stevig project hebben kunnen scoren. Altijd goed voor de omzet en de werkzekerheid.

  • Hiring again

    July 26, 2025 - Posted in agency-life build-in-public hiring industry jobs

    I started hiring again at Obra Studio. Find our jobs at our website:

    • Digital Product Designer (Belgium)
    • Diseñador/a de productos digitales (Mexico City)

    We’ve grown a lot since we started the agency in the beginning of 2025. We’re a solid team now looking to grow to the next level.

    A few things keep coming back in calls so I thought I’d write about them to avoid giving the same explanation to everyone.

    Language requirements

    Requiring Dutch as a language has given me a lot of pause over the years. Why is Dutch a hard language requirement when more than 80% of our internal communication is in English, and clients in general don’t mind working in English…?

    This requirement is about the Belgian market. Currently we have 6 Belgian clients and 2 clients in the US.

    Team members are encouraged to use public channels on Slack, avoid too many DMs (especially when they contain project info or discussions) and speak English in general.

    So why still this language requirement for Dutch? The reality of the Belgian IT market is that a significant part the taxes we pay flow into government and government-subsidized projects (18.15 billion EUR in 2024).

    The environments you end up working in for some projects (universities, government departments, subsidized orgs like VDAB, VRT etc.) are typically 100% Dutch and projects require you to speak Dutch. As such to be hirable for these types of contracts, you need to speak Dutch as well. We haven’t had this type of project yet, but with Mono in the last two years, a rather significant part of our income came via these types of projects.

    These projects have been a reality to keep an interface design agency afloat in Belgium. For all the buzz around Belgian startups, the scene in general is relatively immature with most funding floating to the same types of parties; funding in general being severely compared to a few golden years ago if you exclude the outliers (e.g. Lighthouse) or companies that don’t hire for project work anyway (Odoo).

    A secondary reason is that some of our work is in an industry context where the users of our work (e.g. factory workers) do not speak English. The usability test has to be conducted in Dutch.

    Company hubs

    It is our intention to create two company hubs: one in Belgium and in Mexico City.

    Belgium is pretty small and we focus on the triangle Antwerp – Brussels – Ghent. Currently most of the team is based around Ghent, but we have people from Brussels and Limburg as well.

    Mexico City is a huge city and travelling within the city can take as much time as switching cities in Belgium by train. We are generally centered around the neighborhood of Condesa.

    Generally work is 100% remote with exceptions for meeting the other team members for design workshops or limited social activities. Independence to go towards our clients and conduct workshops with the client, do usability tests and field research on location (in hospitals, factories, schools…) is a requirement for designers.

    I don’t want to be the company that sends their employees on an Ardennes weekend twice a year, taking away their free time. However, I am planning to do a Christmas dinner in Belgium, and eventually want to make enough money to have the team gather in a place with a latin vibe, realistically a good place in Spain would be the stand-in for the ultimate dream, sending Belgian to visit Mexico or the other way around; sending the Mexican team to visit Europe.

    For Mexico City, the idea is to get an office in a co-working space and work together 1-2 days a week. Ideally the person we find is a real chilango, and communication is in both English and Spanish. We have been doing designer, developer & PM meetup events in the city to grow our network.

    Some freelancers have already decided to travel on their own to Mexico and say hi. I myself travel 2-3 times per year to Belgium and then spend time with the team and clients.

    Freelance vs payroll

    We are not ready to hire payroll.

    I wrote on this blog earlier that I made the decision to go for freelancers only. We split our job in 2 roles: hiring in Belgium for a freelancer that works part-time and hiring in Mexico for either part-time or full-time.

    I feel like eventually we will want to work with mostly people on payroll when we reach a stable point when it comes to how the business works. But right now, the talent we need is usually with freelancers; and I believe a payroll job is a (very) long-term promise for a stable job, which we can’t provide yet.

    The risk I can realistically assume is to give a freelancer a 3/5 contract for 1 year (132 days); this ties the freelancer to the company but also allows them to do other projects. When there’s a lot of incoming work we can give more work to the freelancer; but if not, in general they have much more certainty having an agency contract than being a freelancer having to sell all of their own projects.

    When a freelancer joins with a year contract, they don’t have to worry about sales or marketing themselves. Projects get sold for them. You have stability for 1 year and possibly much more if the agency grows.

    This stability comes at a certain price where the agency obviously takes a margin on the work to grow itself and to pay the roles not directly generating revenue (business development, sales, marketing)

    Design level expectation & Obra Education

    In many applications, designers mention that they are not learning; either they are in an environment where they are the only designer, or the environment they are working in does not value design.

    Obra is 100% the polar opposite of that, where if you’re looking to expand your skills and to grow as a designer, you are in the right place.

    That doesn’t mean we don’t have a baseline expectation in place for the level of design you already have. We want you to grow from a good designer to an excellent designer.

    At Obra, we have an education pillar where we focus on Figma workshops, we’ve been actively exploring how to design with AI (in a good way) for almost a year now; and in general, we are focused on reaching a very high level of design.

    If a high enough level cannot be attained, the designer is mentored to get there (and the more senior designers compensate to deliver a great project). There’s my profile as an agency owner, but next to this we currently have 2 senior design mentors to help grow medior designers to a senior level.

    Interested? Know someone?

    Are you interested? Know someone that is perfect to join for an important role to grow a new boutique design studio, that helps software companies to the next level? Find our jobs at our website:

    • Digital Product Designer (Belgium)
    • Diseñador/a de productos digitales (Mexico City)
  • Processing credit card statements efficiently

    June 26, 2025 - Posted in pre-accounting workflow

    This is another pre-accounting post. Last time I talked about dealing with international invoices in Google Sheets.

    This post is about processing credit card statements efficiently.

    What do I mean by “processing credit card statements”?

    The task at hand here is to compare the expenses you have in 1 table in a sheet, with the statements from the credit card expenses statement.

    Why would you do this?

    If you are doing pre-accounting tasks i.e. gathering all docs for your bookkeeper, this helps you to gather your documents.

    I will look at every line item and then either validate that I already have the invoice, or be reminded to find the invoice.

    The role of these documents vs transactions in double-entry bookkeeping

    Your credit card has a final value that gets removed from your business account when it’s time to settle the bill. Every time you make a purchase with a business credit card, a line item gets added to the statement.

    Your accountant will have to match the line items against the corresponding documents to have supporting documentation when doing the quarterly VAT return.

    If you accidentally make a private purchase, this will have to be marked so a private purchase doesn’t end up in your business expenses.

    The problem

    My accountant has complained in the past that I didn’t find every document, and then I was presented with the dreaded “wachtrekening”, a document that lists all the missing documents.

    This list always contained 10-15 documents… after a while, I got complaints from my bookkeeper about my accuracy when doing the pre-accounting, so I decided to be more diligent about it.

    The process

    Every month, I get my business credit card statements from KBC via Doccle. There is a feature within Doccle where you can add an accountant to a connection. Within that feature, you can add an e-mail address. I added my own e-mail address, so this way, I get the statements via e-mail and do not have to enter Doccle. This is what they look like:

    This old document contains only 3 transactions, but at this point in time for Obra Studio, I have to process 30-40 transactions per month.

    To make sure that I have an invoice for every line item on the statement, I started adding the line items from the credit card statement to what I call my “shadow bookkeeping” sheet.

    This is a Google Sheet that contains income and expenses.

    As a first step, I need the data. I’ve saved this prompt, which I put in ChatGPT along with the document:

    Please give me a CSV of this PDF with the following columns.
    
    date of transaction
    date of settlement
    description
    amount in EUR

    ChatGPT then generates a CSV:

    After downloading this CSV, what you’ll want to do is append the current sheet to your Google doc, via the “Import file” dialog.

    This leads to having the entries in your Google doc:

    The next step is unfortunately a manual step for me: look up the different documents and compare them against the statements.

    There’s more things to be automated here: finding the documents in my mailbox, and match them automatically.

    A task for an AI agent, maybe?

    If you have any workflow tips, feel free to share them in the comments.

  • Jurassic World: Rebirth 

    June 25, 2025 - Posted in film

    Ik wist niet dat er een nieuwe Jurassic Park uitging komen, tot ik hier in de buurt een gigantische advertentie zag.

    Ik zag uit dat er een nieuwe versie van Jurassic World Evolution uitkomt tegen eind dit jaar.

    Het is misschien niet zo hoogstaand, maar: sign me up!

  • A React Native version of Multi Currency Converter in 3 hours

    June 19, 2025 - Posted in development react-native

    Yesterday afternoon, I sat down with a friend and asked him for some advice on React Native.

    He recommended that since everything is moving towards Expo to use Expo Router, to use React Native Reusables (which is akin to a shadcn/ui for React Native) and also to use NativeWind.

    I got inspired and decided to just make an app. I started at 6pm and I finished at 9pm.

    Making something is the best way to get experience. First, I created new React Native reusables project.

    I removed some of the initial complexity of the setup. It ships with six or seven components, but I actually only wanted two. Components work shadcn-style so you can easily remove the code and add new components. It also ships with dark mode, and I didn’t want to get lost in the details, so I removed the dark mode code.

    The easy thing about the Multi-Currency Converter is that I’ve built it two times before. I built an iOS version that I never shipped (see this blog post), and a web version (which you can find here). Because I know exactly what I want, I can look at the previous app and instruct an LLM to “vibe code” it for me.

    Here’s a demo of my result:

    How it was made

    After doing some initial setup and understanding the codebase manually, I got started.

    I set up the UI for the main view containing a list of your currencies and a virtual keyboard, the edit language settings view and the edit currency settings view, I started making improvements.

    I used a combination of Cursor, IntelliJ Idea Ultimate, the mac OS terminal and Wispr flow

    After having a working UI with mock data, I got to implementing the actual functionality. I already had the code for this from previous projects. This was an easy conversion from the web version since the code is pretty much the same: a request to an API storing the user settings in local storage and… done.

    I decided not to focus on i8n, dark mode or offline support for now. These features can always be added later.

    My impressions

    Overall, the experience was quite good. Changing the Tailwind styles via NativeWind felt more closer to web development than anything else

    The last time I tried to make something with React Native was 6 or 7 years ago. Yesterday I made an entire app in a couple of hours, that works both on my Android phones and my iPhones.

    What’s next for this side project?

    Next up is checking out more of the evolved ecosystem: I hear good things about EAS – Expo Application Services. Maybe I can get a build into the hands of people.

    I also have a 6-month old marketing design that I need to get out. Maybe this could be a new Framer project? Framer has been evolving like crazy.

    Looking to help?

    If you’re looking to help ship any of this, let me know: johan@obra.studio .

  • Dealing with international invoices in Google Sheets

    June 17, 2025 - Posted in pre-accounting workflow

    In what I call my “shadow bookkeeping”, I have a table with expenses.

    In this table, I have various invoices with various currencies: euros, US dollars, British pounds and Mexican Mexican Pesos.

    I pay most of my business expenses with a business credit card. If the expense is in a foreign currency, a transaction will happen where the foreign currency is converted to Euros.

    The exact conversion amount is in my MasterCard transcript. However, I always want to know what I’m spending and where. It doesn’t have to be 100% accurate; but some accuracy is nice to get an overview of costs.

    At some point I introduced a currency column to my sheet, which had a currency code – for example EUR, USD or MXN.

    Then I would use the issue date and the Google Finance formula to find currency exchange info – to convert from US dollars to Euro, for example.

    The formula looks like this (where G171 refers to a column with the currency code; B171 refers to a column with the issue date and F171 refers to an original amount):

    =INDEX(GOOGLEFINANCE("CURRENCY:"&G171&"EUR"; "price"; B171); 2;2)*F171

    This worked, but not always. Turns out that on weekends or on dates that the stock exchange is closed, the API returns N/A (not available) as a value.

    Today I finally fixed this issue with a bit of a stupid “hack”: I take the same formula but repeat it with a fallback minus 3 days. So if it’s a Sunday, it will refer to a Thursday. It it’s a Saturday it will refer to a Wednesday. If the stock exchange is closed, it will refer to 3 days earlier (hopefully not a weekend day).

    =IFERROR(INDEX(GOOGLEFINANCE("CURRENCY:" & G163 & "EUR"; "price"; B163); 2; 2); INDEX(GOOGLEFINANCE("CURRENCY:" & G163 & "EUR"; "price"; B163 - 3); 2; 2)) * F163

    This seems to work for my cases. I am sure it can be more robust, but it works. If need be, I can change the 3 to a 2 or 1 or another number to be close to the right currency exchange.

    if you want to replicate this on your end, here’s a screenshot of the setup of my columns:

← older
  • ©2025 Johan Ronsse
  • X
  • Mastodon
  • Portfolio 2024