<?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: Pablo Werlang</title>
    <description>The latest articles on DEV Community by Pablo Werlang (@werlang).</description>
    <link>https://dev.to/werlang</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%2F1621512%2Ff1ddee79-27d0-41ba-bd04-f0b378d7ae5a.jpg</url>
      <title>DEV Community: Pablo Werlang</title>
      <link>https://dev.to/werlang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/werlang"/>
    <language>en</language>
    <item>
      <title>Why I Built an Open-Source Online Judge Instead of Maintaining a Legacy One</title>
      <dc:creator>Pablo Werlang</dc:creator>
      <pubDate>Thu, 04 Jun 2026 02:33:44 +0000</pubDate>
      <link>https://dev.to/werlang/why-i-built-an-open-source-online-judge-instead-of-maintaining-a-legacy-one-51gh</link>
      <guid>https://dev.to/werlang/why-i-built-an-open-source-online-judge-instead-of-maintaining-a-legacy-one-51gh</guid>
      <description>&lt;p&gt;For years, IFSul – Campus Charqueadas, a federal institute in southern Brazil, has hosted programming marathons for both high school and undergraduate students.&lt;/p&gt;

&lt;p&gt;Like many educational institutions, our goal has always been straightforward: create opportunities for students to develop problem-solving skills, learn programming, and experience the challenge and excitement of competitive programming.&lt;/p&gt;

&lt;p&gt;What most participants never see, however, is everything happening behind the scenes.&lt;/p&gt;

&lt;p&gt;This is the story of how our contests evolved from manual grading to automated judging, why I decided to build a new platform instead of maintaining a legacy one, and how that project eventually became both an open-source judge system and an online competitive programming platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Era of Manual Grading
&lt;/h2&gt;

&lt;p&gt;When our programming marathons began, there was no automated judging system.&lt;/p&gt;

&lt;p&gt;Teams would solve problems, submit their source code, and wait for organizers to evaluate the solutions manually.&lt;/p&gt;

&lt;p&gt;The process was exactly as tedious as it sounds.&lt;/p&gt;

&lt;p&gt;An organizer would collect the source file, compile it, execute it against test cases, compare the results with the expected output, and then determine whether the solution should be accepted.&lt;/p&gt;

&lt;p&gt;For small competitions, this approach was manageable.&lt;/p&gt;

&lt;p&gt;As participation grew, it quickly became clear that it would not scale.&lt;/p&gt;

&lt;p&gt;If we wanted our competitions to continue growing, we needed automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter BOCA
&lt;/h2&gt;

&lt;p&gt;To solve this problem, a colleague introduced &lt;a href="https://github.com/cassiopc/boca" rel="noopener noreferrer"&gt;BOCA&lt;/a&gt; into our competitions.&lt;/p&gt;

&lt;p&gt;For those unfamiliar with it, BOCA is a contest management and judging system widely used in Brazil, including in competitions associated with the Brazilian Computer Society (SBC). It has been around for many years and has played an important role in the Brazilian competitive programming ecosystem.&lt;/p&gt;

&lt;p&gt;For us, it represented a major improvement.&lt;/p&gt;

&lt;p&gt;Instead of managing teams, submissions, and scoreboards manually, we now had a dedicated platform built specifically for programming contests.&lt;/p&gt;

&lt;p&gt;The administrative side became significantly easier.&lt;/p&gt;

&lt;p&gt;The judging side, however, was a different story.&lt;/p&gt;

&lt;p&gt;While BOCA supports automatic judging, configuring and maintaining that infrastructure was never particularly straightforward. The platform reflects design decisions from a different era of software development, and getting everything configured correctly required navigating a considerable amount of documentation, scripts, permissions, and server-specific configuration.&lt;/p&gt;

&lt;p&gt;In practice, automatic judging frequently failed at exactly the wrong moment: during the contest itself.&lt;/p&gt;

&lt;p&gt;As a result, we often used BOCA primarily as a contest management tool while much of the actual judging continued to happen manually.&lt;/p&gt;

&lt;p&gt;It worked.&lt;/p&gt;

&lt;p&gt;But it wasn't the experience we wanted.&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%2Fvjaux8bhtpreflpolnyd.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%2Fvjaux8bhtpreflpolnyd.png" alt="BOCA Online Contest Administrator" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Moment Everything Changed
&lt;/h2&gt;

&lt;p&gt;Eventually, responsibility for running the programming marathon landed on my desk.&lt;/p&gt;

&lt;p&gt;There was no crisis.&lt;/p&gt;

&lt;p&gt;No catastrophic outage.&lt;/p&gt;

&lt;p&gt;No dramatic handover.&lt;/p&gt;

&lt;p&gt;The contest was still running, and BOCA was still there.&lt;/p&gt;

&lt;p&gt;The problem was much simpler.&lt;/p&gt;

&lt;p&gt;I knew almost nothing about administering BOCA.&lt;/p&gt;

&lt;p&gt;So I did what any developer would do: I started reading documentation, installation guides, configuration files, and forum discussions.&lt;/p&gt;

&lt;p&gt;The deeper I went, the less interested I became in becoming a BOCA expert.&lt;/p&gt;

&lt;p&gt;To be clear, BOCA has served the competitive programming community well for decades.&lt;/p&gt;

&lt;p&gt;But I had little desire to spend my time learning the intricacies of a large legacy system with a configuration process that felt unnecessarily complicated and difficult to maintain.&lt;/p&gt;

&lt;p&gt;At some point, I stopped asking myself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I configure BOCA correctly?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And started asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If I were building a contest platform today, what would it look like?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question eventually became AutoJudge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting From Scratch
&lt;/h2&gt;

&lt;p&gt;When I decided to build AutoJudge, my objective wasn't simply to replace BOCA.&lt;/p&gt;

&lt;p&gt;I wanted to solve the problems I personally experienced while preparing competitions.&lt;/p&gt;

&lt;p&gt;Before writing a single line of code, I established a few principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment should be simple and reproducible.&lt;/li&gt;
&lt;li&gt;Contest setup should not require extensive system administration knowledge.&lt;/li&gt;
&lt;li&gt;The interface should be friendly for both organizers and competitors.&lt;/li&gt;
&lt;li&gt;The judging infrastructure should be reliable enough that organizers can trust it during live events.&lt;/li&gt;
&lt;li&gt;Educational institutions should be able to self-host the platform without fighting the infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These principles guided every decision that followed.&lt;/p&gt;

&lt;p&gt;AutoJudge began as a side project aimed at improving our local competitions.&lt;/p&gt;

&lt;p&gt;What started as a tool built for a specific need gradually evolved into an open-source project that other institutions can also use and adapt to their own contests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Judge
&lt;/h2&gt;

&lt;p&gt;At its core, AutoJudge consists of three major components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A web application used by participants and administrators.&lt;/li&gt;
&lt;li&gt;An API responsible for contest management.&lt;/li&gt;
&lt;li&gt;A judging system responsible for evaluating submissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the most important parts of any judge system is executing untrusted code safely.&lt;/p&gt;

&lt;p&gt;Every submission received by the platform is code written by a participant. By definition, the system must execute programs that it did not create and cannot fully trust.&lt;/p&gt;

&lt;p&gt;To address this, AutoJudge executes submissions inside isolated containerized environments.&lt;/p&gt;

&lt;p&gt;When a solution is submitted:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The submission enters the judging queue.&lt;/li&gt;
&lt;li&gt;The source code is prepared for execution.&lt;/li&gt;
&lt;li&gt;An isolated execution environment is created.&lt;/li&gt;
&lt;li&gt;Resource limits are applied.&lt;/li&gt;
&lt;li&gt;The solution is compiled and executed.&lt;/li&gt;
&lt;li&gt;The output is compared against the expected results.&lt;/li&gt;
&lt;li&gt;The execution environment is discarded.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Containerization is not a guarantee of perfect security, nor should it be considered one.&lt;/p&gt;

&lt;p&gt;Its purpose is to provide a practical isolation boundary that reduces risk while remaining manageable for educational institutions.&lt;/p&gt;

&lt;p&gt;For our use case, it offered a good balance between safety, reliability, and operational simplicity.&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%2F2pqsk5bq2nksczix74tw.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%2F2pqsk5bq2nksczix74tw.png" alt="AutoJudge Architecture Overview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adopting AutoJudge
&lt;/h2&gt;

&lt;p&gt;After enough development and testing, we decided as a group to adopt AutoJudge in our programming marathons.&lt;/p&gt;

&lt;p&gt;The difference was immediate.&lt;/p&gt;

&lt;p&gt;Instead of worrying about fragile contest infrastructure, we could focus on creating better competitions.&lt;/p&gt;

&lt;p&gt;Creating and managing problems became considerably easier thanks to the web-based interface.&lt;/p&gt;

&lt;p&gt;The judging process became more reliable.&lt;/p&gt;

&lt;p&gt;The interface was significantly more approachable for students.&lt;/p&gt;

&lt;p&gt;Most importantly, organizers could spend less time fighting the platform and more time running the event.&lt;/p&gt;

&lt;p&gt;That was the entire point.&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%2Fg4kqff9eazphvi0ovhme.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%2Fg4kqff9eazphvi0ovhme.png" alt="Campus Charqueadas using AutoJudge on a Contest" width="800" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Open-Sourced It
&lt;/h2&gt;

&lt;p&gt;As we continued using AutoJudge, I started thinking about a simple question.&lt;/p&gt;

&lt;p&gt;If we had struggled with these problems, how many other schools and universities were facing the same situation?&lt;/p&gt;

&lt;p&gt;Many educational institutions want to host programming contests.&lt;/p&gt;

&lt;p&gt;Many instructors want to introduce competitive programming to their students.&lt;/p&gt;

&lt;p&gt;Many communities want to organize local events.&lt;/p&gt;

&lt;p&gt;What they often lack is the time and infrastructure expertise required to maintain complex systems.&lt;/p&gt;

&lt;p&gt;That realization is what motivated me to open-source the project.&lt;/p&gt;

&lt;p&gt;Today, the judge, API, and web platform are all available publicly.&lt;/p&gt;

&lt;p&gt;My hope is that other institutions can benefit from the same tools we built for ourselves.&lt;/p&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="//github.com/werlang/autojudge"&gt;github.com/werlang/autojudge&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Self-Hosting
&lt;/h2&gt;

&lt;p&gt;The open-source platform solved our institutional problem.&lt;/p&gt;

&lt;p&gt;But another idea kept coming back.&lt;/p&gt;

&lt;p&gt;What about everyone who doesn't want to host anything?&lt;/p&gt;

&lt;p&gt;What about students who simply want to practice?&lt;/p&gt;

&lt;p&gt;What about teachers who want to create contests without provisioning servers, configuring databases, managing updates, or maintaining infrastructure?&lt;/p&gt;

&lt;p&gt;Those questions eventually led to &lt;strong&gt;autojudge.io&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing autojudge.io
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://autojudge.io" rel="noopener noreferrer"&gt;autojudge.io&lt;/a&gt; builds on the same ideas behind AutoJudge while removing the need for self-hosted infrastructure.&lt;/p&gt;

&lt;p&gt;Instead of downloading, deploying, configuring, and maintaining the platform yourself, you can simply create an account and start using it.&lt;/p&gt;

&lt;p&gt;Students can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solve public problems.&lt;/li&gt;
&lt;li&gt;Track their progress.&lt;/li&gt;
&lt;li&gt;Compare themselves against other competitors.&lt;/li&gt;
&lt;li&gt;Participate in contests hosted by institutions and communities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Educators and organizers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create contests.&lt;/li&gt;
&lt;li&gt;Manage participants.&lt;/li&gt;
&lt;li&gt;Publish problem sets.&lt;/li&gt;
&lt;li&gt;Run competitions without worrying about servers or deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One feature that quickly became central to the platform is the integrated web-based code editor.&lt;/p&gt;

&lt;p&gt;Participants can read a problem statement, write code directly in the browser, execute their solution, test it against custom inputs, and submit it to the official judging queue without ever leaving the platform.&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%2Fhfyw3i3i3m72pny8yh7n.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%2Fhfyw3i3i3m72pny8yh7n.png" alt="AutoJudge Editor" width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The editor provides a complete workflow for competitive programming:&lt;/p&gt;

&lt;p&gt;Read the problem statement.&lt;br&gt;
Write code.&lt;br&gt;
Run and debug solutions.&lt;br&gt;
Test against sample or custom cases.&lt;br&gt;
Submit to the judge.&lt;br&gt;
Review verdicts and execution results.&lt;/p&gt;

&lt;p&gt;This makes the platform particularly accessible for newcomers, who can start solving problems immediately without installing compilers, configuring IDEs, or setting up local development environments.&lt;/p&gt;

&lt;p&gt;For experienced competitors, it provides a convenient environment for quick practice sessions and online contests.&lt;/p&gt;

&lt;p&gt;The goal is not to replace traditional development tools.&lt;/p&gt;

&lt;p&gt;The goal is to reduce friction and make participation as straightforward as possible.&lt;/p&gt;

&lt;p&gt;Some institutions prefer complete control and self-hosting through the open-source AutoJudge platform.&lt;/p&gt;

&lt;p&gt;Others prefer a zero-configuration solution that is ready to use immediately.&lt;/p&gt;

&lt;p&gt;I wanted to support both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;AutoJudge started because I didn't want to spend my time learning how to maintain a legacy contest platform.&lt;/p&gt;

&lt;p&gt;I wanted something simpler.&lt;/p&gt;

&lt;p&gt;Something easier to deploy.&lt;/p&gt;

&lt;p&gt;Something easier to understand.&lt;/p&gt;

&lt;p&gt;Something designed around the needs of students and educators rather than the constraints of decades-old infrastructure.&lt;/p&gt;

&lt;p&gt;What began as a practical solution for a local programming marathon eventually evolved into an open-source project and an online platform used beyond our campus.&lt;/p&gt;

&lt;p&gt;There is still a lot to improve.&lt;/p&gt;

&lt;p&gt;The judging infrastructure continues to evolve.&lt;/p&gt;

&lt;p&gt;New features continue to be developed.&lt;/p&gt;

&lt;p&gt;And there are countless ideas still waiting to be implemented.&lt;/p&gt;

&lt;p&gt;But the core mission remains unchanged:&lt;/p&gt;

&lt;p&gt;Make programming contests easier to organize and more accessible to everyone.&lt;/p&gt;

&lt;p&gt;If you're involved in programming education, competitive programming, or educational technology, I'd love to hear your experiences.&lt;/p&gt;

&lt;p&gt;How does your institution handle programming contests?&lt;/p&gt;

&lt;p&gt;What tools are you using today?&lt;/p&gt;

&lt;p&gt;And have you ever looked at a legacy system and thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I could probably build this myself."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because that's exactly how AutoJudge started.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>opensource</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
    <item>
      <title>About Sharing Local Inference: A Marketplace for Renting Idle GPUs with an OpenAI-Compatible Backend</title>
      <dc:creator>Pablo Werlang</dc:creator>
      <pubDate>Mon, 04 May 2026 20:42:09 +0000</pubDate>
      <link>https://dev.to/werlang/about-sharing-local-inference-a-marketplace-for-renting-idle-gpus-with-an-openai-compatible-5gj0</link>
      <guid>https://dev.to/werlang/about-sharing-local-inference-a-marketplace-for-renting-idle-gpus-with-an-openai-compatible-5gj0</guid>
      <description>&lt;p&gt;The last year of AI tooling has felt weirdly split in two.&lt;/p&gt;

&lt;p&gt;On one side, frontier cloud models are still impressive, still useful, and still setting the pace for a lot of the industry. On the other side, they are getting harder to treat like stable infrastructure. Prices move up, limits get tighter, availability gets noisier, and the feeling of building on top of someone else's quota policy keeps getting stronger.&lt;/p&gt;

&lt;p&gt;At the same time, the supply side is changing fast.&lt;/p&gt;

&lt;p&gt;Chinese model labs and open-weight ecosystems are shipping at a pace that would have felt unrealistic not long ago. The gap with the biggest frontier models is still real, but for a lot of practical tasks it is getting smaller, and sometimes smaller much faster than the market narrative suggests. That matters because once the quality floor rises enough, the whole question changes from “who owns the smartest model?” to “who can serve good-enough intelligence cheaply, reliably, and close to the user?”&lt;/p&gt;

&lt;p&gt;That shift is why more people are buying GPUs for local LLM use.&lt;/p&gt;

&lt;p&gt;Some are doing it for privacy. Some want predictable costs. Some care about latency. Some just want control over the stack instead of depending on a remote platform that can change the rules overnight. And once those GPUs exist, a second question shows up almost immediately: what happens when they sit idle?&lt;/p&gt;

&lt;p&gt;That question is what pulled me into this project.&lt;/p&gt;

&lt;p&gt;I was not trying to make a polished product pitch out of it. I wanted to see what happened if I treated that question as an actual backend design problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this started to feel worth building
&lt;/h2&gt;

&lt;p&gt;Three things seem to be converging at once.&lt;/p&gt;

&lt;p&gt;First, frontier cloud APIs are becoming harder to treat like boring infrastructure. Prices move, limits tighten, regional availability changes, and a lot of teams are discovering that “just call the best hosted model” is not as stable a default as it looked a year ago.&lt;/p&gt;

&lt;p&gt;Second, the supply side is changing. Chinese labs and open-weight ecosystems are shipping fast, and the quality curve is rising quickly enough that for many practical tasks the question is no longer only “which model is smartest?” but also “which model is good enough at the best operational cost?”&lt;/p&gt;

&lt;p&gt;Third, a lot more people now own GPUs than they used to. Some bought them for privacy. Some for latency. Some for predictable cost. Some because they want to run agents and workflows locally without asking permission from a remote platform every five minutes. Once those GPUs exist, one obvious systems question appears:&lt;/p&gt;

&lt;p&gt;How do we coordinate idle capacity?&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;I wanted to explore a simple premise: if people already own GPUs for local inference, why not let them rent out idle capacity to other developers through a marketplace?&lt;/p&gt;

&lt;p&gt;Not a vague “decentralized AI” slogan. A concrete backend structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;workers connect and advertise model capacity&lt;/li&gt;
&lt;li&gt;consumers send requests through an OpenAI-compatible API&lt;/li&gt;
&lt;li&gt;the platform matches demand to supply&lt;/li&gt;
&lt;li&gt;responses stream back in real time&lt;/li&gt;
&lt;li&gt;usage gets settled after the job completes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That became LocalLMarket: a peer-to-peer marketplace for LLM compute where GPU owners can publish an offer and API users can buy inference from the available pool.&lt;/p&gt;

&lt;p&gt;The goal was not to pretend this is solved. The goal was to build a working backend structure that lets me experiment with the idea in a serious way, and show the developer community both the possibilities and the obstacles.&lt;/p&gt;

&lt;p&gt;This repository is exactly that: a working backend for testing the concept, not a production-ready marketplace.&lt;/p&gt;

&lt;h2&gt;
  
  
  The way I ended up thinking about it
&lt;/h2&gt;

&lt;p&gt;Once I got past the vague “decentralized AI” framing, the problem became much easier to reason about.&lt;/p&gt;

&lt;p&gt;It stopped looking like a grand vision and started looking like a handful of pretty ordinary backend concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;discovery: which workers exist and what do they offer?&lt;/li&gt;
&lt;li&gt;matching: which worker should handle this request?&lt;/li&gt;
&lt;li&gt;relay: how do tokens get streamed back to the caller?&lt;/li&gt;
&lt;li&gt;settlement: who pays whom, and when?&lt;/li&gt;
&lt;li&gt;trust: how do you stop the whole thing from becoming nonsense?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That framing is what led me to build LocalLMarket.&lt;/p&gt;

&lt;p&gt;Not as a finished startup. Not as “Uber for GPUs,” which is the kind of phrase that should make everyone a little nervous. As a working backend structure for experimenting with the concept and seeing where the real engineering friction actually is.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal architecture for this kind of system
&lt;/h2&gt;

&lt;p&gt;The current repo implements a pretty opinionated split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an API service owns the public HTTP surface, authentication, worker selection, stream relay, and settlement&lt;/li&gt;
&lt;li&gt;worker processes connect outward over WebSocket, advertise model capacity, receive jobs, run inference, and stream results back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That shape matters.&lt;/p&gt;

&lt;p&gt;Instead of exposing a public HTTP server on every worker node, the system keeps the control plane in one place and treats workers more like queue consumers. That simplifies the first version of the problem: auth, accounting, and routing stay centralized while compute stays distributed.&lt;/p&gt;

&lt;p&gt;Here is the abstract flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Consumer app / agent
        |
        | OpenAI-compatible request
        v
API service
  - authenticate user
  - apply pricing/throughput constraints
  - choose worker
  - create order record
        |
        | WebSocket job dispatch
        v
Worker node
  - run model
  - stream chunks back
        |
        | SSE relay
        v
Consumer app / agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fpa28jb9jvipq8m4jjcgw.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%2Fpa28jb9jvipq8m4jjcgw.png" alt="A clean technical architecture diagram on a light background showing three layers: Consumer Apps and AI Agents on the left, a central API Service in the middle, and multiple Worker GPU Nodes on the right. Arrows show OpenAI-compatible HTTP requests into the API, WebSocket job dispatch from API to workers, and streaming token responses back through the API to clients. Labels include auth, matching, settlement, and stream relay. Style: modern editorial diagram, not glossy marketing art" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why the OpenAI-compatible part matters more than it sounds
&lt;/h2&gt;

&lt;p&gt;One decision I like here is using an OpenAI-compatible API surface.&lt;/p&gt;

&lt;p&gt;This is not just about convenience. It is about lowering integration resistance.&lt;/p&gt;

&lt;p&gt;If a local compute marketplace speaks the same language most tooling already expects, it can drop into existing applications and almost any agentic workflow with very little ceremony. You are not asking developers to rebuild orchestration just to try a different supply layer.&lt;/p&gt;

&lt;p&gt;In practice, the mental shift becomes:&lt;/p&gt;

&lt;p&gt;"What if I changed the base URL and the backend supply model, but kept the rest of my app or agent stack basically the same?"&lt;/p&gt;

&lt;p&gt;That mattered a lot to me while building this.&lt;/p&gt;

&lt;p&gt;An agent loop, internal tool runner, or multi-step workflow can keep using the same chat completion pattern while routing requests through a marketplace-backed control plane instead of a single centralized vendor.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen-or-llama-worker-pool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are an agent planner.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize this incident report.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That same pattern works whether the caller is a chatbot, an internal automation service, or an agentic workflow coordinating multiple model calls. The point is not that OpenAI is the only interface that matters. The point is that compatibility turns a weird infrastructure experiment into a very small application change.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the project turned into, technically
&lt;/h2&gt;

&lt;p&gt;What fell out of this pretty quickly was that the idea is less about “building a marketplace” and more about stitching together five backend problems.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Worker registration
&lt;/h3&gt;

&lt;p&gt;Workers need to identify themselves, declare which model they can serve, expose pricing and throughput information, and maintain a live session with the control plane.&lt;/p&gt;

&lt;p&gt;Conceptually, the worker advertises an offer like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpu-node-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen2.5-32b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"available"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The exact fields are less important than the shape: you need a registry of who can do what, at what cost, and whether they are actually online.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Matching logic
&lt;/h3&gt;

&lt;p&gt;Once a request arrives, the system needs to choose a worker. The current project keeps that intentionally simple: respect consumer constraints such as max price and minimum throughput, then prefer the cheapest suitable worker with throughput as a tie-breaker.&lt;/p&gt;

&lt;p&gt;In pseudocode, the idea is basically:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;workers&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;requestedModel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tps&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;minTps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;left&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;right&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;right&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tps&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;left&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is enough to make the market legible before you start adding more sophisticated routing, reputation weighting, or dynamic pricing.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Stream relay
&lt;/h3&gt;

&lt;p&gt;Once the worker starts generating output, the system has to relay chunks back to the caller in real time. While the worker is connected over WebSocket to the API service, the caller is usually expecting an HTTP response with a streaming body. That means the API service has to be a middleman for the token stream, which adds some complexity around backpressure, error handling, and connection management. &lt;/p&gt;
&lt;h3&gt;
  
  
  4. Settlement
&lt;/h3&gt;

&lt;p&gt;Billing in LLM systems is awkward because you often do not know the exact final cost until generation is complete. So the cleaner model is usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create an execution record when dispatch starts&lt;/li&gt;
&lt;li&gt;compute actual cost when usage is known&lt;/li&gt;
&lt;li&gt;debit the requester&lt;/li&gt;
&lt;li&gt;credit the worker owner&lt;/li&gt;
&lt;li&gt;keep platform fee logic explicit instead of magical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the pattern this backend uses.&lt;/p&gt;
&lt;h2&gt;
  
  
  The limitations are not side notes
&lt;/h2&gt;

&lt;p&gt;This is the part that is still the hardest. If you are paying for remote inference, how do you know the results are real?&lt;/p&gt;

&lt;p&gt;A marketplace for remote model execution is not just a routing problem. It is a trust problem wearing a routing costume.&lt;/p&gt;
&lt;h3&gt;
  
  
  You cannot robustly verify worker execution yet
&lt;/h3&gt;

&lt;p&gt;If a worker says it ran a given model, there is no built-in proof that it actually did. No trusted execution environment. No strong attestation. No cryptographic proof of faithful execution. That is a major unresolved problem, not an implementation detail.&lt;/p&gt;

&lt;p&gt;When the worker gives you back tokens, you have no strong guarantee they came from a real model running on a GPU instead of a different and cheaper model, a local cache, or even a random token generator. That is a fundamental trust issue that any open marketplace has to grapple with.&lt;/p&gt;

&lt;p&gt;If the workers are all running in a shared physical environment you control, that is less of an issue. But if the whole point is to let anyone rent out their GPU, it becomes a real problem.&lt;/p&gt;
&lt;h3&gt;
  
  
  Reputation is still weak
&lt;/h3&gt;

&lt;p&gt;Uptime and request count are better than nothing, but only slightly. A real market would need stronger feedback loops, better failure accounting, dispute handling, and probably model-specific trust signals.&lt;/p&gt;
&lt;h3&gt;
  
  
  This is not production-ready
&lt;/h3&gt;

&lt;p&gt;That is deliberate. The repository is a working backend structure for experimenting with the idea, sharing the tradeoffs, and making the constraints visible to other developers. It is not pretending to be a finished marketplace product.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I think this is worth discussing now
&lt;/h2&gt;

&lt;p&gt;I do not think the interesting future is just “everyone uses one hosted frontier API forever.”&lt;/p&gt;

&lt;p&gt;Model capability is diffusing. Hardware ownership is diffusing. Agentic workflows are increasing demand for repeated, composable model calls. And once teams start caring more about cost control, locality, and infrastructure independence, alternative supply layers become much more interesting.&lt;/p&gt;

&lt;p&gt;A local LLM marketplace is one possible response to that shift.&lt;/p&gt;

&lt;p&gt;Maybe it becomes a serious category. Maybe it stays niche. Maybe the trust problem is harder than the market opportunity. All of those are plausible outcomes. But I think it is worth exploring in code rather than only in threads and hot takes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I am sharing the repo anyway
&lt;/h2&gt;

&lt;p&gt;Part of the fun of building something like this is that it forces a bunch of fuzzy industry arguments to become concrete.&lt;/p&gt;

&lt;p&gt;You stop saying “decentralized inference” and start asking much more useful questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;where should the control plane live?&lt;/li&gt;
&lt;li&gt;how will workers register and stay authenticated?&lt;/li&gt;
&lt;li&gt;how will you choose between price, latency, and throughput?&lt;/li&gt;
&lt;li&gt;how will you make streaming reliable?&lt;/li&gt;
&lt;li&gt;what trust model are you actually offering users?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions are more valuable than the slogan.&lt;/p&gt;

&lt;p&gt;If you want to see the implementation I used to explore them, the repo is here:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/werlang" rel="noopener noreferrer"&gt;
        werlang
      &lt;/a&gt; / &lt;a href="https://github.com/werlang/locallmarket" rel="noopener noreferrer"&gt;
        locallmarket
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Peer-to-peer LLM compute marketplace
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LocalLMarket&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;🤝 Peer-to-peer LLM compute marketplace. Anyone can contribute GPU power and earn. Anyone can access affordable AI.&lt;/strong&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 The Problem&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;LLM inference is expensive. OpenAI, Claude, Gemini—they all charge premium prices because they own the compute. Meanwhile, millions of people and businesses have idle GPU capacity: a gaming PC, a cloud instance running 4 hours a day, a research lab with spare hardware.&lt;/p&gt;

&lt;p&gt;Why should all that compute go unused? Why should consumers pay centralized prices when free-market competition could drive costs down by 10x or 100x?&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 The Solution&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;LocalLMarket&lt;/strong&gt; is a peer-to-peer marketplace where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workers&lt;/strong&gt; (anyone with a GPU) register a model, set their own price, and earn credits per completed request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumers&lt;/strong&gt; find the best-priced worker meeting their needs and call the model via a simple API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The platform&lt;/strong&gt; matches orders, streams responses, settles payments, and tracks reputation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No gatekeepers. No middlemen. Just fair-market pricing and&lt;/strong&gt;…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/werlang/locallmarket" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;If you have built something adjacent, or if you think this architecture breaks in an important way, I would genuinely like feedback. The point of publishing this is not to advertise a product. It is to compare notes with other developers while this design space is still open.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>openai</category>
      <category>api</category>
    </item>
  </channel>
</rss>
