You (Probably) Don't Need
Build New Admin

Are you building Another internal admin app,
just so that your marketers and PMs can tweak settings on the website?
Well, meet Adminless!

How it works?


1. Find the code you want to make remotely editable
function Page({ locale }: { locale: "en" | "es" }) {
  const i18n = {
    en: {
      title: "Hello World",
      description: "This is description",
    },
    es: {
      title: "Hola Mundo",
      description: "Esto es descripción",
    },
  }[locale]

  return <div>
    <h1>{i18n.title}</h1>
    <p>{i18n.description}</p>
  </div>
}
2. Create Adminless Collection, Paste It!
export interface Todo {
            title: string;
            done: boolean;
          }
3. Make your application to read from Adminless
4. Invite your colleague to edit Document!

Use Cases


Landing Pages

Title, Description, Banner, Button Text, Localization... It's just JSON

import { useAdminlessDocument } from "adminless-react";
const variants = {
  "title": [{
    weight: 0.5, value: "Hello World A",
  }, {
    weight: 0.5, value: "Hello World B",
  }]
};

function randomVariant<Variant extends { weight: number }>(variants: Variant[]): Variant {
  const totalWeight = variants.reduce((sum, variant) => sum + variant.weight, 0);
  const random = Math.random() * totalWeight;
  let sum = 0;
  for (const variant of variants) {
    sum += variant.weight;
    if (random < sum) {
      return variant;
    }
  }
  throw new Error("should not happen");
}

function Page() {
  const title = randomVariant(useAdminlessDocument("remote-config").title);
  return <h1>{title.value}</h1>
}

AB Testing

Simple JSON is more than enough to run almost all AB testing you can think of.

import { useAdminlessDocument } from "adminless-react";
const variants = {
  "title": [{
    weight: 0.5, value: "Hello World A",
  }, {
    weight: 0.5, value: "Hello World B",
  }]
};

function randomVariant<Variant extends { weight: number }>(variants: Variant[]): Variant {
  const totalWeight = variants.reduce((sum, variant) => sum + variant.weight, 0);
  const random = Math.random() * totalWeight;
  let sum = 0;
  for (const variant of variants) {
    sum += variant.weight;
    if (random < sum) {
      return variant;
    }
  }
  throw new Error("should not happen");
}

function Page() {
  const title = randomVariant(useAdminlessDocument("remote-config").title);
  return <h1>{title.value}</h1>
}

(Crappy) Business Logic

We should probably not do this, but we all need to do this at some point of our startup journey 🚀
if you know what i mean 😉

{
    "specialDiscounts": [{
      "sku": ["sku_123", "sku_456", "sku_789"],
      "rate": 0.3,
      "startDate": "2021-12-24",
      "endDate": "2021-12-25",
      "description": "Christmas Sale"
    }]
  }

Pricing


Free
1000 read/day
50 write/day
1 Collection
1 User
Pro
10,000,000 read/day
1000 write/day
1024 Collection
100 User
Enterprise
You probably should make your own config system
- But feel free to contact us for custom plan

Frequently Asked Questions


Isn't this just a CMS?

Does your CMS tool gives you a schema based formatted data editor for non-developer yet return schema complying JSON? If you can't tell the difference, you probably don't need this.

How is this different from Firestore?

Firesbase (or Firestore) is a more of "managed database" service meaning more focused on larger, dynamic entries of data manipulated through APIs If you want to make simple editable configuration, it's probably overkill

How is this different from Firebase Remote Config?

Remote Config is (at least originally) simple key-value store for single atomic values like string/number/boolean, Plus A/B testing
it does support "JSON" doesn't have concept of schema, nor gives you editor for non developers. it works almost like string anyway
Though now it added all sort of weird features like "Personalization" and "Audience" which is even more strange considering there is firestore as more "serious" database
Well i guess that why i'm not working at Google
Only valuable thing we see from remote config that Adminless "formally" doesn't support is A/B testing,
As we describe on example, even that can be really easily achievable with simple JSON object.

import { useAdminlessDocument } from "adminless-react";
const variants = {
  "title": [{
    weight: 0.5, value: "Hello World A",
  }, {
    weight: 0.5, value: "Hello World B",
  }]
};

function randomVariant<Variant extends { weight: number }>(variants: Variant[]): Variant {
  const totalWeight = variants.reduce((sum, variant) => sum + variant.weight, 0);
  const random = Math.random() * totalWeight;
  let sum = 0;
  for (const variant of variants) {
    sum += variant.weight;
    if (random < sum) {
      return variant;
    }
  }
  throw new Error("should not happen");
}

function Page() {
  const title = randomVariant(useAdminlessDocument("remote-config").title);
  return <h1>{title.value}</h1>
}

Isn't this vendor lock-in?

All you ever store in Adminless is just JSON and Schema, you can export it anytime you want.
You should be able to drop-in replace implementation that using Adminless with that static JSON file very, very easily.
In which case, all you ever loose is ability to edit those JSON remotely with UI - which is exactly what Adminless is for.