<?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: KREO</title>
    <description>The latest articles on DEV Community by KREO (@__2944490ced25).</description>
    <link>https://dev.to/__2944490ced25</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%2F4023373%2F0405768d-178c-48fe-91ed-4c0e8cc7953c.png</url>
      <title>DEV Community: KREO</title>
      <link>https://dev.to/__2944490ced25</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/__2944490ced25"/>
    <language>en</language>
    <item>
      <title>Every table you create becomes an instant REST + GraphQL API</title>
      <dc:creator>KREO</dc:creator>
      <pubDate>Fri, 10 Jul 2026 02:43:56 +0000</pubDate>
      <link>https://dev.to/__2944490ced25/every-table-you-create-becomes-an-instant-rest-graphql-api-2ile</link>
      <guid>https://dev.to/__2944490ced25/every-table-you-create-becomes-an-instant-rest-graphql-api-2ile</guid>
      <description>&lt;p&gt;I keep rebuilding the same backend.&lt;/p&gt;

&lt;p&gt;Postgres, then auth, then a little CRUD API on top, then a cache once it gets slow, then websockets when I want live updates. By the time that's working I've burned a week and haven't touched the actual idea yet. Did it enough times that I got annoyed and made the thing that does it for me.&lt;/p&gt;

&lt;p&gt;It's called KREO. You write your tables in SQL and the API is just... already there.&lt;/p&gt;

&lt;p&gt;You make this:&lt;/p&gt;

&lt;p&gt;create table todos (&lt;br&gt;
  id bigserial primary key,&lt;br&gt;
  task text not null,&lt;br&gt;
  done boolean default false&lt;br&gt;
);&lt;br&gt;
and it's a REST endpoint right away:&lt;/p&gt;

&lt;p&gt;curl "&lt;a href="https://app.kreo.work/api/rest/todos?done=false&amp;amp;limit=20" rel="noopener noreferrer"&gt;https://app.kreo.work/api/rest/todos?done=false&amp;amp;limit=20&lt;/a&gt;" \&lt;br&gt;
  -H "x-kreo-api-key: $KEY"&lt;br&gt;
Filtering, sorting, pagination are just query params, I didn't wire up anything. Same schema also gives you a GraphQL API with a playground (no resolvers to write):&lt;/p&gt;

&lt;p&gt;{ todos(where: { done: false }, limit: 5) { id task } }&lt;br&gt;
Auth is built in (passwords, passkeys, MFA, plus API keys you can lock to an IP for scripts). There's realtime if you subscribe to a table, a Redis cache you flip on per table, serverless functions, file storage, pgvector if you're doing AI stuff. It's a normal Postgres schema underneath, so your own indexes/views/constraints still work.&lt;/p&gt;

&lt;p&gt;Instead of making you sign up to see any of it, I stuck the actual dashboard behind a throwaway demo project that already has data in it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.kreo.work/demo" rel="noopener noreferrer"&gt;https://app.kreo.work/demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go run some queries, hit the API. It's read-only so you can't break anything.&lt;/p&gt;

&lt;p&gt;Free right now while it's in beta, 100k requests a month, no card. Docs: &lt;a href="https://app.kreo.work/docs" rel="noopener noreferrer"&gt;https://app.kreo.work/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I work on it so obviously I'm biased, but I really do want to know what other people think. If you were starting something tomorrow, what would actually stop you from using this? What's missing?&lt;/p&gt;

&lt;p&gt;KREO:&lt;br&gt;
  &lt;a href="https://kreo.work" rel="noopener noreferrer"&gt;https://kreo.work&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>postgres</category>
      <category>backend</category>
      <category>api</category>
    </item>
  </channel>
</rss>
