Change your copy / constants fast and without deploying via Config.ly!

Instantly update static / config data on all your apps/servers without waiting on a deploy or App Store review. Keep data consistent across platforms. Let developers spend time on hard software problems—not copy / style tweaks.

Get started free
Hero image

How Configly Works: An Example

render() {
  const COST = "$1,000,000";
  const [ UPGRADE_1, UPGRADE_2, UPGRADE_3 ] = [ "5G", "AC", "Hot rod paint" ];
  const TAG_LINE = "Sometimes you gotta run before you walk";
  return (
    <div>
        <p>The suit costs: $1,000,000</p>
        <p>Here are the upgrades you can select:</p>
        <select>
           <option value="0">{UPGRADE_1}</option>
           <option value="1">{UPGRADE_2}</option>
           <option value="2">{UPGRADE_3}</option>
        </select>
        <p> At Stark ENT we say: "{TAG_LINE}"  </p>
    </div>
  );
}

func populateViewController() {
   let vc = SecondaryViewController(nibName: "IronSuitStoreView", bundle: nil)
   vc.priceText = "The suit costs $1,000,000"
   vc.upgradeValues = ["5G", "AC", "Hot rod paint"]
   vc.tagLine = "At Stark ENT we say: \"Sometimes you gotta run before you walk\""
}

<div>
   <p>The suit costs: $1,000,000</p>
   <p>Here are the upgrades you can select:</p>
   <select>
      <option value="0">5G</option>
      <option value="1">AC</option>
      <option value="2">Hot rod paint</option>
   </select>
   <p> At Stark ENT we say: "Sometimes you gotta run before you walk" </p>
</div>  

const loadStore = (req, res) => {
   const COST = "$1,000,000";
   const [ UPGRADE_1, UPGRADE_2, UPGRADE_3 ] = [ "5G", "AC", "Hot rod paint" ];
   const TAG_LINE = "Sometimes you gotta run before you walk";

   res.send(`
      <div>
         <p>The suit costs: ${COST}</p>
         <p>Here are the upgrades you can select:</p>
         <select>
            <option value="0">${UPGRADE_1}</option>
            <option value="1">${UPGRADE_2}</option>
            <option value="2">${UPGRADE_3}</option>
         </select>
         <p> At Stark Enterprises we say "${TAG_LINE}" </p>
      </div>
   `);
}

Tony Stark decided to sell some custom Iron Man suits and built a store website.

Note that he hardcoded some data such as the cost, the suit options, and marketing copy.

Tony puts the constants in Configly

Being a top-notch engineer, Tony reads Hacker News and learns about Config.ly. He signs up, adding his Configs in the web interface:

<ConfiglyContext.Provider value={{apiKey: 'Dem0apiKEY'}}>
   <div>
      <p> The suit costs: <ConfiglyText prop="suit_cost" /> </p>
      <p> Pick an upgrade! </p>
      <ConfiglyDropdown prop="suit_upgrades" />
      <p> At Stark ENT we say: <ConfiglyText prop="suit_marketing_copy" /> </p>
   </div>
</ConfiglyContext.Provider>

import configly

struct IronManInventory: Decodable {
    var cost: String
    var upgrades: [String]
    var tagLine: String
}

func populateViewController() {
  let vc = SecondaryViewController(nibName: "IronSuitStoreView", bundle: nil)

  let client = CNGClient.setup(withApiKey: "Dem0apiKEY")
  client.object(forKey: "iron_man_store") { 
    (error, value: IronManInventory?) -> () in
      guard let value = value else {
          return
      }

      // Never again wait for an App Store approval to change copy!
      vc.priceText = "The suit costs \(value.cost)"
      vc.upgradeValues = value.upgrades;
      vc.tagLine = "At Stark Enterprises we say: '\(value.tagLine)'"
};

<body>
<div>
  <p>The suit costs: <span id="amount"></span>
  <p>Here are the upgrades you can select:</p>
  <select id="upgrades"></select>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/config.js"></script>
<script>
  var configly = Configly.init('Dem0apiKEY');
  configly.get('iron_man_store').then((value) => {
    if (!value) return;
    document.querySelector('#amount').innerHTML = value['cost'];

    value['upgrades'].forEach((v, i) => {
      let o = document.createElement('option');
      o.value = i;
      o.text = v;
      document.querySelector('#upgrades').add(o, null);
    })
  });
</script>


const Configly = require('configly-js');
const configly = Configly.init('Dem0apiKEY');

const handler = async (req, res) => {
  const { cost, upgrades, tagLine } = await configly.get('iron_man_store');
  const options = upgrades.map((v, i) => `<option value="${i}">${v}</option>`);
  res.render(`
    <div>
        <p>The suit costs: ${cost}</p>
        <p>Here are the upgrades you can select:</p>
        <select>
          ${options.join("\n")}
        </select>
        <p> At Stark Enterprises we say "${tagLine}" </p>
    </div>
  `);
}

Tony integrates Configly with his frontend to fetch the data

The Configly library caches his data so he doesn't need to worry about added latency. The Configly service is also highly available and built for high throughput.

He now hands off ownership of updating these values to less technical Rhodey who owns copy and pricing. Unburdened, Tony can now focus on building out his store's distributed locking mechanism or saving the world (again).

Features & Pricing

Feature

  • High availability
  • Storage limit
  • Web CMSInfo
  • Support
  • Accounts / Permissions
  • Version History
  • Configurable TTL
  • Best-in-class Security
  • Privacy (GDPR, CCPA)
  • Preview Changes
  • Throughput cap

Free

  • Included
  • 100 kB
  • Included
  • Included
  • Not included
  • Coming soon
  • Included
  • Included
  • Included
  • Not included
  • 50 QPS
  • Get Started

Enterprise

  • Included
  • Unlimited
  • Included
  • Included
  • Coming Soon
  • Coming Soon
  • Included
  • Included
  • Included
  • Coming soon
  • Generous
  • Contact Us

Supported Technologies

We believe you should be able to use whatever stack you prefer and we're quickly adding support for more.

React React
Javascript JavaScript
iOS iOS
Node.js Node.js
Ruby Ruby / Rails

Coming soon

Android Android
Python Python
NET .NET
Go Go
Angular Angular
Your language isn't supported? Let us know it should be next

Example Uses

There are many use cases for Configly. Here, we highlight a few.

Mobile Copy & Styling

Mobile Copy & Styling

Update the look, feel and copy on your apps across both platforms instantly through our web interface without waiting for an App Store approval. No need to be technical to update the copy.

CMS

CMS

Put copy and other data that the business cares about in Configly. Let the business owners update the copy and all of the frontends / apps pull data from this one source. Any updates are automatically updated in near real-time.

Internationalization

Internationalization/i18n

Store all your translated copy on Configly and let translators directly edit them. Translators and Product can update the copy without asking developers for help.

Feature flags

Feature Flags

Toggle on and off features near instantly. Roll them out only to specific users to verify they work properly and slowly ramp traffic. Disable or revert features in real time if you discover bugs.

Emergency Response

Kill Switches and Emergency Response

Ensure the business keeps running during hard times and minimize time spent working during oncall. Enable SREs to react instantaneously during an incident or attack -- tweaking timeouts / throttle rates; disabling features under attack; or blocking IPs.

Server

Server Driven UI

Update the look and feel of all your platforms in a single place without having to wait for the App Store Review Process nor deploys. Make layout changes without having to write code.