<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Christian • ancer</title>
    <description>The latest articles on DEV Community by Christian • ancer (@ancer).</description>
    <link>https://dev.to/ancer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3965198%2F9b8a4f0e-f78d-4238-89e1-0b08c446259e.png</url>
      <title>DEV Community: Christian • ancer</title>
      <link>https://dev.to/ancer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ancer"/>
    <language>en</language>
    <item>
      <title>Every Dependency Has a Cost</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Sat, 25 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/every-dependency-has-a-cost-19cm</link>
      <guid>https://dev.to/ancer/every-dependency-has-a-cost-19cm</guid>
      <description>&lt;p&gt;One of the best things about modern software development is that we don't have to build everything ourselves. Open-source libraries and third-party packages let us solve complex problems in minutes instead of days, allowing us to focus on what actually makes our applications unique.&lt;/p&gt;

&lt;p&gt;That's why adding a dependency often feels like an obvious choice.&lt;/p&gt;

&lt;p&gt;The problem is that every dependency comes with baggage.&lt;/p&gt;

&lt;p&gt;You're not only importing code—you are also importing someone else's release cycle, security updates, breaking changes, licensing decisions, and maintenance priorities. Even the most popular packages can become abandoned or introduce changes that force you to adapt your own project.&lt;/p&gt;

&lt;p&gt;That doesn't mean dependencies are bad. Many of them save hundreds of hours of work and have become industry standards for good reason. The key is being intentional instead of installing a package for every small problem.&lt;/p&gt;

&lt;p&gt;Before adding a new dependency, I usually ask myself a few simple questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it solve a significant problem?&lt;/li&gt;
&lt;li&gt;Is the project actively maintained?&lt;/li&gt;
&lt;li&gt;Could I reasonably implement this myself?&lt;/li&gt;
&lt;li&gt;If I needed to remove it later, how difficult would that be?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions don't always lead to the same answer, but they help avoid unnecessary complexity.&lt;/p&gt;

&lt;p&gt;While building Convertim, I've found that saying &lt;strong&gt;"no"&lt;/strong&gt; to an extra dependency is sometimes the better engineering decision. A few more lines of code today can mean fewer updates, fewer compatibility issues, and less maintenance in the future.&lt;/p&gt;

&lt;p&gt;Architecture isn't only about choosing the right technologies.&lt;/p&gt;

&lt;p&gt;Sometimes it's also about choosing &lt;strong&gt;what not to add.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Features We Chose Not To Build</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Wed, 22 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/the-features-we-chose-not-to-build-2lde</link>
      <guid>https://dev.to/ancer/the-features-we-chose-not-to-build-2lde</guid>
      <description>&lt;p&gt;When people talk about software development, the conversation usually revolves around what gets added. New features generate excitement, screenshots, release notes and marketing material. They give users something tangible to explore and give developers something new to build. It's easy to believe that the value of a product grows in direct proportion to the number of capabilities it offers.&lt;/p&gt;

&lt;p&gt;In reality, some of the most important product decisions never appear in a changelog.&lt;/p&gt;

&lt;p&gt;Every feature starts as a good idea. Someone encounters a problem, imagines a solution and suggests adding another option, another setting or another workflow. Looking at those ideas one by one, it's surprisingly difficult to reject them because each proposal often makes perfect sense on its own. The challenge only becomes visible when you look at the product as a whole instead of evaluating individual requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every Feature Is a Long-Term Commitment
&lt;/h2&gt;

&lt;p&gt;Adding functionality isn't just about writing code. Every new feature becomes part of the application for as long as the product exists. It needs documentation, testing, maintenance and compatibility with everything that comes afterwards. Future updates have to take it into account, bug fixes become more complicated and every new release has one more moving part that can potentially fail.&lt;/p&gt;

&lt;p&gt;Those costs are rarely obvious when the feature is first implemented. At that moment, all you see is the problem it solves. The maintenance cost only becomes apparent months or even years later, when the product has evolved and dozens of independent decisions begin interacting with one another.&lt;/p&gt;

&lt;p&gt;That's why product development isn't simply a process of adding value. It's also a process of deciding which responsibilities you're willing to carry in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Best Question Isn't "Can We Build It?"
&lt;/h2&gt;

&lt;p&gt;As developers, we naturally enjoy solving technical problems. When someone suggests a useful feature, the first instinct is often to think about how it could be implemented. Modern frameworks, libraries and development tools make building software faster than ever, which means the technical challenge is often smaller than it used to be.&lt;/p&gt;

&lt;p&gt;The more interesting question isn't whether something can be built. It's whether it deserves to become part of the product.&lt;/p&gt;

&lt;p&gt;Some ideas solve edge cases that affect very few people. Others introduce configuration screens that make the interface harder to understand. Some require new dependencies, increase testing effort or create maintenance work that continues long after the original problem has been forgotten.&lt;/p&gt;

&lt;p&gt;A feature can be technically successful while still making the product worse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Convertim Meant Rejecting Good Ideas
&lt;/h2&gt;

&lt;p&gt;While building Convertim, there were plenty of ideas that looked genuinely useful. Some would have added flexibility, others would have supported additional workflows, and a few would probably have looked impressive on a feature list.&lt;/p&gt;

&lt;p&gt;We still decided not to build them.&lt;/p&gt;

&lt;p&gt;Not because they were impossible, but because they moved the application away from its main purpose. Convertim was designed to be a simple, local-first image conversion tool. Every feature that doesn't reinforce that goal has to justify the complexity it introduces, and many perfectly reasonable ideas simply couldn't pass that test.&lt;/p&gt;

&lt;p&gt;Saying "no" isn't about limiting the product. It's about protecting it from gradually becoming something it was never intended to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simplicity Doesn't Happen By Accident
&lt;/h2&gt;

&lt;p&gt;Software naturally becomes more complex over time. Every new option, every additional workflow and every extra dependency increases the number of decisions both developers and users have to make. Left unchecked, complexity accumulates almost automatically.&lt;/p&gt;

&lt;p&gt;Simplicity works differently.&lt;/p&gt;

&lt;p&gt;A simple product is usually the result of dozens of conscious decisions to leave things out. Those decisions often happen long before users ever download the application, and they're rarely visible from the outside. Users don't know which features were rejected during development, but they do notice when a tool feels focused, predictable and easy to understand.&lt;/p&gt;

&lt;p&gt;That's why simplicity should never be confused with a lack of effort. In many cases, it's the result of much more discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think Beyond The Next Release
&lt;/h2&gt;

&lt;p&gt;It's tempting to evaluate features based on how exciting they are today. They make a roadmap look more impressive and provide something new to announce. The problem is that software doesn't stop evolving after the next release. Every decision becomes part of the foundation that future versions have to build upon.&lt;/p&gt;

&lt;p&gt;One mindset that has helped me is to imagine maintaining today's decisions a year from now. If a feature still feels worthwhile after considering future updates, bug fixes and ongoing maintenance, it's probably a good investment. If its long-term value is difficult to justify, adding it simply because it's possible is rarely the right answer.&lt;/p&gt;

&lt;p&gt;Thinking that way doesn't slow development down. It keeps the product moving in the right direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;A product isn't defined only by what it includes. It's also defined by everything its creators intentionally leave out.&lt;/p&gt;

&lt;p&gt;Users rarely ask whether a feature was difficult to build, but they immediately notice when an application feels focused, coherent and easy to use. Those qualities don't appear by chance. They're usually the result of hundreds of small decisions, many of which involve saying "no" to ideas that seemed perfectly reasonable at the time.&lt;/p&gt;

&lt;p&gt;Sometimes the best feature isn't the next one you add.&lt;/p&gt;

&lt;p&gt;It's the one you decide not to build.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why Software Friction Matters</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Sat, 18 Jul 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/why-software-friction-matters-3iki</link>
      <guid>https://dev.to/ancer/why-software-friction-matters-3iki</guid>
      <description>&lt;p&gt;When we talk about improving software, the first idea is usually to add something new: another feature, another option, another way to customize the experience.&lt;/p&gt;

&lt;p&gt;But many times, the biggest improvements come from the opposite direction. Removing unnecessary steps, reducing decisions users should not have to make, and making common actions feel simpler.&lt;/p&gt;

&lt;p&gt;That is where software friction appears.&lt;/p&gt;

&lt;p&gt;Friction is everything that creates distance between the user and the result they want to achieve. It can be an extra step repeated hundreds of times, a confusing setting, a slow process, or a workflow that forces people to adapt to the tool instead of helping them complete their task.&lt;/p&gt;

&lt;p&gt;Individually, these problems usually look small. One extra click does not seem important. Waiting a few more seconds feels acceptable. Manually repeating an action once is not a big issue.&lt;/p&gt;

&lt;p&gt;But software is built around repetition, and small moments of friction become much more noticeable over time.&lt;/p&gt;

&lt;p&gt;Reducing friction is not only a design problem. It is also an engineering decision.&lt;/p&gt;

&lt;p&gt;A simple experience often depends on things users never directly see: how the application is structured, how workflows are designed, which defaults are selected, and which features are intentionally kept simple.&lt;/p&gt;

&lt;p&gt;The goal is not always to add more possibilities. Sometimes the better decision is making the existing workflow clearer, faster, and easier to understand.&lt;/p&gt;

&lt;p&gt;Good software does not just solve a problem. It removes everything unnecessary between the user and that solution.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What is a small improvement in a tool that completely changed your experience using it?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>software</category>
      <category>productivity</category>
      <category>softwareengineering</category>
      <category>ux</category>
    </item>
    <item>
      <title>Why Convertim Uses One Binary For GUI And CLI</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Wed, 15 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/why-convertim-uses-one-binary-for-gui-and-cli-4cj</link>
      <guid>https://dev.to/ancer/why-convertim-uses-one-binary-for-gui-and-cli-4cj</guid>
      <description>&lt;p&gt;When building Convertim, one of the early technical decisions was how different workflows should be supported. Some users prefer opening an application, dragging a few files, choosing an output format and pressing a button. Others prefer running commands, automating repetitive tasks or integrating tools into existing workflows.&lt;/p&gt;

&lt;p&gt;Both approaches solve the same problem, but they represent different ways of interacting with software. The challenge was deciding whether those workflows should become separate tools or different ways to use the same application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The initial decision
&lt;/h2&gt;

&lt;p&gt;A common solution would have been creating two independent tools: a desktop application focused on visual interaction and a command-line tool focused on automation. This approach works well in many projects because each tool can evolve independently and focus on a specific type of user.&lt;/p&gt;

&lt;p&gt;While designing Convertim, we looked at it from a different perspective. Were we actually building two different products, or were we creating two different ways to access the same functionality?&lt;/p&gt;

&lt;p&gt;That question influenced the internal architecture. Instead of treating the graphical interface and the command line as separate projects, we decided to keep them as different entry points connected to the same core.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separating interface from logic
&lt;/h2&gt;

&lt;p&gt;One of the most important ideas behind this decision was separating the user interface from the actual processing logic. The conversion engine, file handling, validation and configuration should not depend on whether someone interacts with the application visually or through a terminal.&lt;/p&gt;

&lt;p&gt;The graphical interface and the command line are simply different layers built around the same foundation. They receive different types of input, but the core responsible for processing those actions remains shared.&lt;/p&gt;

&lt;p&gt;This separation means improvements made internally benefit both workflows. Changes to conversion logic, optimizations or bug fixes do not need to be implemented multiple times because both experiences rely on the same underlying system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoiding duplicated implementations
&lt;/h2&gt;

&lt;p&gt;Duplicating functionality can sometimes feel like the fastest solution, especially during the early stages of a project. Creating a separate CLI implementation alongside the desktop application would probably have worked initially.&lt;/p&gt;

&lt;p&gt;The problem usually appears later, when both versions need to evolve. A bug fixed in one implementation needs to be fixed again somewhere else. A new option has to be added twice. Small differences slowly appear between tools that are expected to behave consistently.&lt;/p&gt;

&lt;p&gt;Keeping a shared foundation helps reduce those problems. Not because having less code automatically means having better software, but because reducing duplicated logic usually makes a project easier to maintain over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supporting different workflows
&lt;/h2&gt;

&lt;p&gt;A graphical interface works well when direct interaction is the goal. Opening an application, selecting files and visually adjusting options can be the fastest and most comfortable experience for many users.&lt;/p&gt;

&lt;p&gt;But not every workflow works that way. Some tasks are repetitive by nature. Some users need to process many files frequently or include conversion steps inside scripts and automated processes.&lt;/p&gt;

&lt;p&gt;In those situations, forcing every interaction through a graphical interface creates unnecessary friction. The goal of adding CLI support was not to replace the GUI, but to provide another way to interact with the same tool depending on the context.&lt;/p&gt;

&lt;p&gt;Sometimes clicking a button is the best experience. Sometimes running a command is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The technical trade-offs
&lt;/h2&gt;

&lt;p&gt;Keeping GUI and CLI together also introduces some challenges. A shared foundation requires clearer boundaries between different parts of the application because multiple interfaces depend on the same internal behavior.&lt;/p&gt;

&lt;p&gt;Features need to be designed considering more than one interaction model. A change is not only a visual decision anymore; it can affect both manual and automated workflows.&lt;/p&gt;

&lt;p&gt;Like most engineering decisions, this approach is a trade-off. Separate applications provide more independence, while a shared core provides more consistency and reduces duplicated work.&lt;/p&gt;

&lt;p&gt;There is no universal answer. The right decision depends on the goals and constraints of each project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building around workflows
&lt;/h2&gt;

&lt;p&gt;For Convertim, keeping GUI and CLI inside the same application was not about adding another feature. It was about designing the application around the idea that different users can have different workflows without needing completely different tools.&lt;/p&gt;

&lt;p&gt;The visible part of software is usually the interface, but many of the decisions that define the experience happen much deeper in the architecture.&lt;/p&gt;

&lt;p&gt;Good architecture often stays invisible.&lt;/p&gt;

&lt;p&gt;And that usually means it is doing its job.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>cli</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Good Software Adapts To People</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Sat, 11 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/good-software-adapts-to-people-542l</link>
      <guid>https://dev.to/ancer/good-software-adapts-to-people-542l</guid>
      <description>&lt;p&gt;When we build software, it's easy to assume there is a correct way to use it. We design interfaces, create workflows and make decisions based on how we imagine people will interact with what we are building.&lt;/p&gt;

&lt;p&gt;But once a tool reaches real users, things are usually much more diverse.&lt;/p&gt;

&lt;p&gt;Different people have different habits, requirements and ways of solving problems. Someone may need a simple interface to complete a task once in a while, while someone else may need to automate that same process hundreds of times as part of a larger workflow.&lt;/p&gt;

&lt;p&gt;Neither approach is better than the other. They are simply different ways of working.&lt;/p&gt;

&lt;p&gt;This is why flexibility is an important part of product design. Giving users different ways to interact with a tool is not about adding complexity. When done correctly, it's about removing friction.&lt;/p&gt;

&lt;p&gt;A graphical interface can make a task more accessible and easier to understand. A command-line interface can make the same task easier to automate and integrate into existing processes.&lt;/p&gt;

&lt;p&gt;Both exist for the same reason: helping people solve a problem in the way that makes the most sense for them.&lt;/p&gt;

&lt;p&gt;Good software should not force everyone into the same workflow. It should provide a clear solution while respecting that different users have different needs.&lt;/p&gt;

&lt;p&gt;Sometimes the best design decisions are not the ones that change how people work, but the ones that allow them to keep working naturally.&lt;/p&gt;

&lt;p&gt;Technology should adapt to people, not the other way around.&lt;/p&gt;

&lt;p&gt;What about you? Has a tool ever changed the way you work for the better, or did it force you to adapt to it?&lt;/p&gt;

</description>
      <category>software</category>
      <category>productivity</category>
      <category>programming</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Designing Software For Different Workflows</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Wed, 08 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/designing-software-for-different-workflows-1hnp</link>
      <guid>https://dev.to/ancer/designing-software-for-different-workflows-1hnp</guid>
      <description>&lt;p&gt;When we build a tool, it is easy to assume there is a correct way to use it. We design an interface, define an ideal flow, and think about how someone should interact with our product.&lt;/p&gt;

&lt;p&gt;But when software reaches real users, a much more interesting reality appears: everyone has their own way of working.&lt;/p&gt;

&lt;p&gt;One person may need to convert a single image before sending it by email or uploading it to a website. Another may process hundreds of files as part of a repetitive workflow. Some people prefer a graphical interface because it feels fast and visual, while others work from a terminal because they need automation and integration with other processes.&lt;/p&gt;

&lt;p&gt;None of these approaches are wrong. They simply solve different needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the balance between simplicity and flexibility
&lt;/h2&gt;

&lt;p&gt;One of the biggest challenges when designing software is finding the right balance between keeping the experience simple and providing enough flexibility to support different scenarios.&lt;/p&gt;

&lt;p&gt;A simple tool should not become a limited tool. At the same time, a powerful tool should not force every user to deal with complexity they may never need.&lt;/p&gt;

&lt;p&gt;This was one of the ideas we kept in mind while building Convertim. For many users, converting an image should be a straightforward process: open the application, select files, choose a format, and get the result.&lt;/p&gt;

&lt;p&gt;No unnecessary configuration. No additional steps. No need to understand how the tool works internally.&lt;/p&gt;

&lt;p&gt;But there are situations where that same approach is no longer enough. If someone needs to convert large amounts of images regularly or integrate that process into another system, manually repeating the same steps stops being efficient.&lt;/p&gt;

&lt;p&gt;The need changes, and the tool should be able to adapt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Graphical interfaces and command lines solve different problems
&lt;/h2&gt;

&lt;p&gt;Graphical interfaces and command-line tools are often treated as opposite approaches, but they are actually designed for different contexts.&lt;/p&gt;

&lt;p&gt;A graphical interface lowers the barrier to entry. It allows someone to use a tool without reading documentation, remembering commands, or understanding technical details.&lt;/p&gt;

&lt;p&gt;A command-line interface, on the other hand, enables different possibilities: automation, scripts, repetitive processes, and integration into larger workflows.&lt;/p&gt;

&lt;p&gt;The important question should not be which option is better.&lt;/p&gt;

&lt;p&gt;The question should be what the person using the tool actually needs.&lt;/p&gt;

&lt;p&gt;A designer preparing images for a project and a developer processing them automatically may be solving exactly the same problem, but from completely different contexts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation is also part of the user experience
&lt;/h2&gt;

&lt;p&gt;Automation is sometimes associated with complex tools designed only for technical users, but its goal is usually the opposite: reducing unnecessary work.&lt;/p&gt;

&lt;p&gt;Automation means removing repetitive actions so people can spend less time on mechanical tasks.&lt;/p&gt;

&lt;p&gt;A good tool should allow users to start with something simple and provide more possibilities only when they become necessary. Not everyone needs access to every option from the beginning, and adding flexibility does not mean increasing the complexity of the main experience.&lt;/p&gt;

&lt;p&gt;It means allowing each person to find the workflow that best fits their needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  More features do not always create a better product
&lt;/h2&gt;

&lt;p&gt;When developing software, it is tempting to measure the evolution of a product by the number of features it includes.&lt;/p&gt;

&lt;p&gt;More options. More settings. More possibilities.&lt;/p&gt;

&lt;p&gt;But every new feature also introduces new decisions, more maintenance, and greater responsibility over the complete experience.&lt;/p&gt;

&lt;p&gt;The most important question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can we add this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What problem are we solving?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Flexibility should be the result of understanding different use cases, not simply accumulating features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software should adapt to people
&lt;/h2&gt;

&lt;p&gt;Every user has different habits, preferences, and needs. Trying to force everyone into a single workflow can end up creating more problems than it solves.&lt;/p&gt;

&lt;p&gt;Good software should not force people to completely change the way they work.&lt;/p&gt;

&lt;p&gt;It should fit naturally into it.&lt;/p&gt;

&lt;p&gt;Because in the end, the best tools are often the ones that stop getting in the way and simply help people do what they need to do.&lt;/p&gt;




&lt;p&gt;This article is part of the journey of building products at &lt;strong&gt;ancer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Convertim is our first public tool: a local-first image converter focused on simplicity, privacy and flexible workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ancer.es/en/project/convertim" rel="noopener noreferrer"&gt;https://ancer.es/en/project/convertim&lt;/a&gt;&lt;/p&gt;

</description>
      <category>software</category>
      <category>productdesign</category>
      <category>programming</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Shipping Is Just the Beginning</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Sat, 04 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/shipping-is-just-the-beginning-nam</link>
      <guid>https://dev.to/ancer/shipping-is-just-the-beginning-nam</guid>
      <description>&lt;p&gt;When you've spent months working on a project, it's easy to believe that launch day is the most important milestone. For a long time, everything revolves around that date: finishing tasks, fixing last-minute bugs, preparing the website, taking screenshots, and polishing the documentation. It all seems to lead to one goal: shipping.&lt;/p&gt;

&lt;p&gt;Then the day finally arrives. You hit the publish button, the project is live, and there's a real sense of excitement and relief. But the next morning, you realize that almost nothing has actually ended.&lt;/p&gt;

&lt;p&gt;That's when the most interesting part begins.&lt;/p&gt;

&lt;p&gt;People start using your software in ways you never expected. Small details that went unnoticed during development suddenly become obvious. Feedback starts coming in, and some of the decisions that once felt final are worth revisiting.&lt;/p&gt;

&lt;p&gt;Over time, you realize that great products don't evolve only through big new features. More often, they improve through small, thoughtful changes: fixing a bug, simplifying a workflow, or removing a tiny piece of friction from the user experience. Those improvements may seem minor, but they're often the ones users appreciate the most.&lt;/p&gt;

&lt;p&gt;That's why every launch is really the beginning of a conversation with the people using your product. Listening, learning, and continuously improving are just as much a part of software development as writing code. Releasing an application is an important milestone, but maintaining it and helping it evolve is what truly turns it into a product.&lt;/p&gt;

&lt;p&gt;The most interesting part starts after release.&lt;/p&gt;

</description>
      <category>software</category>
      <category>productivity</category>
      <category>programming</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>GUI or CLI? Why We Built Both</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Sat, 27 Jun 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/gui-or-cli-why-we-built-both-5mn</link>
      <guid>https://dev.to/ancer/gui-or-cli-why-we-built-both-5mn</guid>
      <description>&lt;p&gt;Software developers love debating interfaces.&lt;/p&gt;

&lt;p&gt;Some people will always prefer a graphical interface, while others feel most productive inside a terminal window. The interesting part is that both groups are usually trying to solve exactly the same problem—they just have different workflows.&lt;/p&gt;

&lt;p&gt;While building Convertim, we quickly realized that choosing one approach over the other would unnecessarily limit the tool.&lt;/p&gt;

&lt;p&gt;For many users, drag and drop is simply the fastest way to work. Open the application, select a folder, choose the output format and click a button. No commands to remember, no documentation to read, and no setup required.&lt;/p&gt;

&lt;p&gt;But developers and power users often have completely different needs.&lt;/p&gt;

&lt;p&gt;They want to integrate image conversion into scripts, CI pipelines, automation tasks or batch jobs that run without human interaction. For them, opening a graphical application would only slow things down.&lt;/p&gt;

&lt;p&gt;Instead of deciding which audience was "right", we decided to support both.&lt;/p&gt;

&lt;p&gt;The graphical interface focuses on simplicity and discoverability, making common tasks accessible with just a few clicks. The command-line interface, on the other hand, exposes the same processing engine in a way that can be scripted and automated.&lt;/p&gt;

&lt;p&gt;Neither interface is better than the other.&lt;/p&gt;

&lt;p&gt;They simply solve different problems.&lt;/p&gt;

&lt;p&gt;Good software should adapt to the user's workflow instead of forcing the user to adapt to the software. Whether someone prefers clicking buttons or writing commands shouldn't change the capabilities they have available.&lt;/p&gt;

&lt;p&gt;In the end, both interfaces share the same goal: making image conversion as simple as possible while staying fast, local and predictable.&lt;/p&gt;

&lt;p&gt;Sometimes the best engineering decision isn't choosing between GUI and CLI.&lt;/p&gt;

&lt;p&gt;It's refusing to make users choose.&lt;/p&gt;

&lt;p&gt;What about you? When a tool offers both options, which one do you reach for first: the GUI or the terminal?&lt;/p&gt;

</description>
      <category>cli</category>
      <category>productivity</category>
      <category>softwareengineering</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Building Convertim: The Engineering Decisions Behind It</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Wed, 24 Jun 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/building-convertim-the-engineering-decisions-behind-it-589d</link>
      <guid>https://dev.to/ancer/building-convertim-the-engineering-decisions-behind-it-589d</guid>
      <description>&lt;p&gt;When we use a piece of software, we usually focus on what we can see: the interface, the available features, or how quickly it gets the job done. In reality, much of a product's quality depends on everything the user never notices.&lt;/p&gt;

&lt;p&gt;The chosen architecture, the way the code is organized, the dependencies that are included, the way errors are handled, or even the decision not to implement a certain feature often have a much greater impact than visible changes to the interface.&lt;/p&gt;

&lt;p&gt;While building Convertim, we've made hundreds of small engineering decisions. None of them are particularly impressive on their own, but together they define the final experience of the product.&lt;/p&gt;

&lt;p&gt;One of the earliest decisions was to keep all image processing local. From a technical perspective, it would have been easier to rely on remote services or external APIs for some conversions. But that would have required sending user files to a server. We preferred taking on additional engineering complexity to ensure that images never leave the user's computer.&lt;/p&gt;

&lt;p&gt;We also wanted to avoid unnecessary installation steps. Many applications require setup wizards, administrator permissions, or additional components before users can even get started. Convertim follows a different approach: a single portable executable that can be launched and used immediately. Achieving that level of simplicity required considerable work behind the scenes, but it creates a much smoother experience for the user.&lt;/p&gt;

&lt;p&gt;Another important decision was designing the application around batch processing from the very beginning. In real-world workflows, people rarely convert a single image. More often, they work with entire folders, photo collections, or website assets. That's why a large part of the internal architecture is built around job queues, concurrent processing, and scalable workflows without making the interface more complicated.&lt;/p&gt;

&lt;p&gt;We also invested significant time in aspects that rarely appear in screenshots: project structure, separation of responsibilities, and long-term maintainability. It's invisible work, but probably one of the most valuable investments any software project can make. Features evolve over time; a solid architecture remains.&lt;/p&gt;

&lt;p&gt;The same applies to automated testing. No user chooses an application because it has hundreds of tests, but those tests allow the product to evolve with confidence, catch regressions before release, and reduce the risk of unexpected bugs. They are an investment in the future, even if users never notice them.&lt;/p&gt;

&lt;p&gt;Software engineering is often associated with using the latest technologies or following the newest industry trends. Our experience has been almost the opposite. The best decisions usually involve removing complexity, reducing unnecessary dependencies, and choosing solutions that will still be easy to understand and maintain years from now.&lt;/p&gt;

&lt;p&gt;In the end, building useful software isn't just about adding features. It's about making hundreds of small decisions that make the product faster, simpler, more maintainable, and more respectful of the people who use it.&lt;/p&gt;

&lt;p&gt;And interestingly enough, when those decisions are the right ones, users rarely notice them. They simply feel that the software works exactly as it should.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>buildinpublic</category>
      <category>softwareengineering</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Useful Software Removes Friction</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Sat, 20 Jun 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/why-useful-software-removes-friction-2eeo</link>
      <guid>https://dev.to/ancer/why-useful-software-removes-friction-2eeo</guid>
      <description>&lt;p&gt;When we think about improving software, our first instinct is usually to add something new. A feature, an integration or another configuration option often feels like progress.&lt;/p&gt;

&lt;p&gt;But after building different products, I've come to believe that the best software improves by removing things instead of adding them.&lt;/p&gt;

&lt;p&gt;Every unnecessary click interrupts a workflow. Every extra screen, mandatory account or confirmation dialog adds a little more friction to the user's experience. None of these decisions seems important on its own, but together they make a tool feel heavier than it should.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0508rlq33vfcfxzm7036.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0508rlq33vfcfxzm7036.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The applications I enjoy using the most are the ones that stay out of the way. They let me focus on my work instead of forcing me to think about the software itself. That kind of simplicity is rarely accidental—it comes from understanding the real problem and having the discipline to avoid unnecessary complexity.&lt;/p&gt;

&lt;p&gt;As developers, it's easy to measure progress by the number of features we ship. But maybe a better measure is how much complexity we've managed to remove for the people who use our products.&lt;/p&gt;

&lt;p&gt;In the end, the most useful software isn't always the one that does the most. It's the one that solves a problem so naturally that you almost forget it's there.&lt;/p&gt;

&lt;p&gt;What's a piece of software you admire because of its simplicity rather than its number of features?&lt;/p&gt;

</description>
      <category>ux</category>
      <category>uidesign</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why I Started Building Convertim</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Wed, 17 Jun 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/why-i-started-building-convertim-4jje</link>
      <guid>https://dev.to/ancer/why-i-started-building-convertim-4jje</guid>
      <description>&lt;p&gt;Over the years, I've used dozens of image converters.&lt;/p&gt;

&lt;p&gt;Some were fast. Others supported an impressive number of formats. Many were free, at least to a certain point. But almost all of them shared one thing that never really made sense to me: converting a local file meant uploading it to someone else's server.&lt;/p&gt;

&lt;p&gt;That might seem perfectly normal today. We've become used to doing almost everything through the browser. But the more I thought about it, the less logical it seemed.&lt;/p&gt;

&lt;p&gt;Why should something as simple as changing an image format require sending that file across the internet?&lt;/p&gt;

&lt;p&gt;Most of the time I just wanted to convert a PNG into WebP, optimize a few screenshots or prepare images for a website. Nothing particularly complex. Yet the workflow was always the same: open a website, accept the cookie banner, wait for the upload, wait for the processing, and finally download the result again.&lt;/p&gt;

&lt;p&gt;It wasn't only about privacy.&lt;/p&gt;

&lt;p&gt;It was about friction.&lt;/p&gt;

&lt;p&gt;Every extra step makes a tool a little bit worse.&lt;/p&gt;

&lt;p&gt;That simple observation eventually became the starting point for Convertim.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem was never image conversion
&lt;/h2&gt;

&lt;p&gt;Building another image converter didn't sound particularly exciting. There are already hundreds of applications capable of converting files in a matter of seconds. The interesting part wasn't the conversion itself, but the unnecessary complexity that had slowly grown around such a simple task.&lt;/p&gt;

&lt;p&gt;We've accepted as normal the idea of opening a website, uploading personal files, trusting that they'll be deleted afterwards and downloading them again a few seconds later. All of this for an operation that any modern computer can perform locally almost instantly.&lt;/p&gt;

&lt;p&gt;What's surprising is that very little of that complexity actually benefits the user. It's simply the way these tools have evolved over the years. We assume that an internet connection is always available, that sending private files to external servers is acceptable or that creating an account is just another small inconvenience we have to live with.&lt;/p&gt;

&lt;p&gt;The more I looked at that workflow, the more obvious it became that image conversion wasn't the real problem. The real problem was all the friction surrounding it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The philosophy behind the project
&lt;/h2&gt;

&lt;p&gt;When I started building Convertim, I wasn't trying to compete with large online services or create the converter with the longest feature list. My goal was much simpler: to build the tool I wanted to use every day.&lt;/p&gt;

&lt;p&gt;I wanted to launch an executable, drag a few images into it, choose the output format and continue with my work. No accounts. No ads. No popups. And most importantly, without my files ever leaving my own computer.&lt;/p&gt;

&lt;p&gt;A tool that simply does its job and gets out of the way.&lt;/p&gt;

&lt;p&gt;I believe that's one of the defining characteristics of well-designed software. The best tools aren't the ones with the most features. They're the ones you barely notice because they remove work instead of creating more of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fewer features. Less friction.
&lt;/h2&gt;

&lt;p&gt;Software development often revolves around adding new functionality. Every release introduces more options, more settings and more configuration screens, as if a product's value could be measured by the number of buttons in its interface.&lt;/p&gt;

&lt;p&gt;But we rarely ask the opposite question: what could we remove?&lt;/p&gt;

&lt;p&gt;Every unnecessary click, every avoidable wait and every external dependency adds a small amount of friction to the user's workflow. Reducing that complexity is usually much harder than adding another feature, but the impact on the overall experience is often far greater.&lt;/p&gt;

&lt;p&gt;That's the principle I tried to follow while building Convertim: simplify the workflow until only the essential remains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the kind of software I want to use
&lt;/h2&gt;

&lt;p&gt;Convertim exists because I needed a tool like this myself. It wasn't born from market research or a business opportunity. It came from repeatedly facing the same small annoyance during everyday work.&lt;/p&gt;

&lt;p&gt;That doesn't guarantee it will become a successful product. But it does mean that every design decision, every feature and every improvement is trying to solve a real problem that I've experienced firsthand.&lt;/p&gt;

&lt;p&gt;In the end, that's also the philosophy I try to apply to every project I build. Not creating software to impress people with endless features, but building tools that respect the user's time and remove unnecessary friction.&lt;/p&gt;

&lt;p&gt;Because the best software isn't the one that gets your attention.&lt;/p&gt;

&lt;p&gt;It's the one you forget is even there while you're getting your work done.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>privacy</category>
      <category>softwaredesig</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why ancer exists</title>
      <dc:creator>Christian • ancer</dc:creator>
      <pubDate>Thu, 11 Jun 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/ancer/why-ancer-exists-1oa9</link>
      <guid>https://dev.to/ancer/why-ancer-exists-1oa9</guid>
      <description>&lt;p&gt;We live in a time when building software has never been easier.&lt;/p&gt;

&lt;p&gt;Every week there’s a new framework, a new library, or a new trend promising to change the way we develop applications. Technology evolves at an incredible pace, and too often it feels like the priority is following the latest trend instead of solving a real problem.&lt;/p&gt;

&lt;p&gt;But most businesses don’t need the latest trend.&lt;/p&gt;

&lt;p&gt;They need tools that work.&lt;/p&gt;

&lt;p&gt;They need systems that are reliable, maintainable, and capable of supporting their growth for years to come.&lt;/p&gt;

&lt;p&gt;That idea is what led to the creation of ancer.&lt;/p&gt;

&lt;p&gt;Not as a traditional agency or a factory of quick projects, but as a software studio where engineering and product thinking come before noise.&lt;/p&gt;

&lt;p&gt;Software Should Solve Problems&lt;/p&gt;

&lt;p&gt;The best software is rarely the most impressive.&lt;/p&gt;

&lt;p&gt;It’s not the one with the fanciest animations or the one everyone talks about on social media.&lt;/p&gt;

&lt;p&gt;It’s the one that quietly becomes part of everyday work.&lt;/p&gt;

&lt;p&gt;The one that automates repetitive tasks.&lt;/p&gt;

&lt;p&gt;The one that prevents mistakes.&lt;/p&gt;

&lt;p&gt;The one that saves time without demanding attention.&lt;/p&gt;

&lt;p&gt;When a tool achieves that, it stops being just an application and becomes part of the workflow.&lt;/p&gt;

&lt;p&gt;And that’s exactly the kind of software we want to build.&lt;/p&gt;

&lt;p&gt;Architecture Matters from Day One&lt;/p&gt;

&lt;p&gt;There’s a simple idea that reflects a common reality in software development:&lt;/p&gt;

&lt;p&gt;The easiest software to build is often the hardest to maintain.&lt;/p&gt;

&lt;p&gt;Many projects are created with only one goal in mind: shipping as quickly as possible. Everything works—until new requirements, new customers, or new processes arrive.&lt;/p&gt;

&lt;p&gt;That’s when the problems begin.&lt;/p&gt;

&lt;p&gt;Every change breaks something else.&lt;/p&gt;

&lt;p&gt;Every new feature takes longer than expected.&lt;/p&gt;

&lt;p&gt;Maintaining the product becomes increasingly expensive.&lt;/p&gt;

&lt;p&gt;At ancer, we believe good architecture isn’t about making a project more complex.&lt;/p&gt;

&lt;p&gt;It’s about making decisions today that will allow the product to keep evolving five years from now.&lt;/p&gt;

&lt;p&gt;Choosing Technology for Stability, Not Popularity&lt;/p&gt;

&lt;p&gt;We don’t chase every new technology trend.&lt;/p&gt;

&lt;p&gt;We prefer mature, stable, and well-supported tools.&lt;/p&gt;

&lt;p&gt;Technology is a means, not an end.&lt;/p&gt;

&lt;p&gt;Choosing a framework simply because it’s popular is rarely the right decision for software that is meant to last.&lt;/p&gt;

&lt;p&gt;We’d rather build on solid foundations than on short-lived trends.&lt;/p&gt;

&lt;p&gt;Because maintaining a system for years is far more important than impressing people for a week.&lt;/p&gt;

&lt;p&gt;Thinking in Products, Not Projects&lt;/p&gt;

&lt;p&gt;Software development is often treated as a checklist.&lt;/p&gt;

&lt;p&gt;Features get implemented, the project gets delivered, and everyone moves on to the next one.&lt;/p&gt;

&lt;p&gt;We prefer to think in terms of products.&lt;/p&gt;

&lt;p&gt;How they’re used.&lt;/p&gt;

&lt;p&gt;How they evolve.&lt;/p&gt;

&lt;p&gt;How they can continue creating value years from now without being rebuilt from scratch.&lt;/p&gt;

&lt;p&gt;That means investing time in architecture, performance, user experience, and maintainability.&lt;/p&gt;

&lt;p&gt;Things that rarely stand out in a demo but make all the difference once a product is in production.&lt;/p&gt;

&lt;p&gt;This Is ancer&lt;/p&gt;

&lt;p&gt;ancer was created around a simple idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build useful software.&lt;/li&gt;
&lt;li&gt;Web applications.&lt;/li&gt;
&lt;li&gt;Internal business tools.&lt;/li&gt;
&lt;li&gt;Automation.&lt;/li&gt;
&lt;li&gt;Desktop applications.&lt;/li&gt;
&lt;li&gt;System integrations.&lt;/li&gt;
&lt;li&gt;Software designed to solve real problems and remain useful over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re not trying to build dozens of products.&lt;/p&gt;

&lt;p&gt;We’d rather build a few and build them well.&lt;/p&gt;

&lt;p&gt;The Beginning&lt;/p&gt;

&lt;p&gt;This is only the first step.&lt;/p&gt;

&lt;p&gt;Over the coming weeks, we’ll be sharing projects, technical decisions, lessons learned, and part of the development process behind them.&lt;/p&gt;

&lt;p&gt;Because we believe good software doesn’t need to exaggerate what it does.&lt;/p&gt;

&lt;p&gt;It simply needs to do its job well.&lt;/p&gt;

&lt;p&gt;And that’s exactly what we want ancer to represent.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>programming</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
