Show HN: Config.ly – Never hardcode your data again
config.ly
config.ly
Who has access to each client's database? Is it audited? Is it encrypted at rest? I'm sure it is, but Config.ly would be wise to add this information to avoid fears.
Also you can store encrypted secrets in Git just fine, there are a number of methods to do so very safely.
https://docs.travis-ci.com/user/environment-variables/#defin...
> Who has access to each client's database? Is it audited? Is it encrypted at rest? I'm sure it is, but Config.ly would be wise to add this information to avoid fears.
This is great feedback, thank you.
You’re able to guard secretes as need, but keep the audit-ability of version control.
You set those on deployment so your engineering team never see production secrets
I could be wrong, but I think some folks would want their other clients -- even their server -- retrieving that value from that one single source. So when you roll an Android app, you'd also want to implement HTTP + caching... And basically you're on the path to building your own Configly.
In my GraphQL api I have a resolver called appConfig. That enables me to fetch the config I need for a screen in the same request as the data and to reuse any caching/offline/http logic the app already has. Zero added latency. No service can beat that, but then it‘s also just me editing postgres to change the config.
Situations with a slow deployment process has been a big motivator for building Config.ly -- and I've seen it happen at companies with medium-sized eng teams (taking hours to swap values during incident fires), and I know it's a problem _all_ iOS developers have due to the app store deploy process.
I also think there's other value here... For instance having a UI means non-technical folks can update it. A lot of my time as an engineer has been spent making copy tweaks (I've felt existing CMS products were too heavy-weight and difficult to plugin).
Also, having turn-key libraries mean you don't have to copy/paste hardcoded values among many clients (or store on the server build an API for _every_ constant). I'm a big fan of DRY.
An instance of an app (process, service, whatever) doesn't need to know that it's "dev", "test", "prod". Just have it look for "the database" and change the /etc/hosts (or equiv) as needed.
My impression is that istio (?) is supposed to formalize this approach. That'd be nice.
I'm so done having this conversation with teammates. Yet another reenactment of the "why use version control" war. There's always some stubborn refusal to join the third millennium. Because reasons. It's too complicated. No one knows how to do that. It's hard to debug. Whatever.
Every new cohort believes they're the first to invent configuration management.
It's nice to be able to push things into the system while it's running without hopping through all the hoops of qa, staging, etc. We then usually move it into the applications base configs in the app repo if it's going to stick around for more than a day or two to keep things tidy.
There's nothing wrong with a service to push config into a system at run-time, and you don't have to throwaway the benefits of the git history.
We’re software engineers and saw that the source of many bugs, incidents and time-sinks stem from hard-coding data. For example - waiting a day or longer for an iOS app store approval of a copy change, waiting hours on an internal CI/deployment process to bump a timeout during a traffic spike incident, or having the same dollar-cost value diverge while hard-coded on iOS, Android and web clients.
In an ideal world, data would be completely separate from code. Databases can do this but often aren’t used that way for good reasons (they can be cumbersome to wire-up, there are scale concerns about adding extra load to your DB, it’s risky to touch a production database, etc). So we built Config.ly.
It has a simple web interface to define Strings, Numbers, Booleans and JSON objects and arrays. We think it’s so simple that even non-technical folks can update basic Config data like copy and colors (so you can focus on code!). We have client libraries (in four techs and growing!) that fetch these values from the server and intelligently handle optimizations like caching.
It’s free to use (with genorous size and bandwidth caps) and getting started from sign-up to fetching values in your client should take < 5 minutes.
And we’d love to hear what you think!
First, some background: I'm a heavy Django user. Django has settings that are loaded once at runtime and usually they're in version control (they're committed to the repo). That means that, if you want to change a value to a setting, you must commit to the repo and re-deploy. If you're using Kubernetes, this might take several minutes (re build the images, upload to the registry, replicate on all the pods, etc).
That'd be the advantage of this solution. Imagine you have to change a setting IMMEDIATELY (something bad happen). You must: * commit to the repo and push * wait for CI (tests, formatting, protocols of PR approvals in a team, etc) * wait for CD (build image, push to registry, replicate, etc) It can potentially take several minutes.
Now, the major drawbacks I see with this service are: * Security: do you guys feel confident/strong enough to store important data of the app? Go so far as hosting secrets for example? (We use the Secret Manager in AWS). * Latency: in our case we read confs only once when the WSGI server starts. Can you be fast enough? * Availability: if your site goes down, my app goes down. Can you ensure 99.9999 availability?
Anyways, this is definitively a needed service. It does have its challenges, but you guys are onto something for sure. Congrats!
https://github.com/kpn-digital/django-etcd-settings
Seems like it’s possible to fetch settings from an external store.
If we build a Python / Django library, would you integrate Configly? If not, what would it take?
I think you hit the nail on the head for a core use-case: deployment processes inhibiting quick data changes. I believe the problem gets worse as you work at larger places... I've worked at [unnamed SF Tech Company with ~1k engineers] where deploying took ~a day simply waiting for the CI along with a backlog of commits from other developers.
I really like the challenges you call out. We don't do a good job of saying this on the site but we explicitly don't want h manage secrets / sensitive data; especially because the API_KEY is on the client libraries - so there isn't really anything stopping anyone from peeking in memory / the source making requests (I think this is different than say a more traditional login-auth system where the secret is stored in a session and only the person with access to the client with that session can access that data).
100% agreed on latency and availability. Config.ly needs be super solid here (sacrificing of course some consistency... slightly delayed updates). Besides following best practices for building/designing/operating high-avail systems (both my cofounder and I have experience here), there are some clever things we can do on the client. For instance, caching should help with both and I thought some of commenters below mentioned had great suggestions for other sorts of clever client fallback mechanisms we can do to help here [1] [2].
Thanks again for the great input!
[1] https://news.ycombinator.com/item?id=25062496 [2] https://news.ycombinator.com/item?id=25063062
You can also upload other types like Strings, Numbers and booleans.
It would probably be a lot of work, but would make life a lot easier for people who use that. Automatically populating enum dropdowns, numeric range enforcement, etc. On the other hand, you wouldn't need to make your own UI to edit the field typings since many JSON Schemas can be generated from code, or with existing visual tools for people who prefer visuals.
Configly looks like it would fill a niche of needing to give levers and dials to a non-technical customer who contracted the technical coding of the app/product out.
> Show HN: Etebase – An open source and end-to-end encrypted Firebase alternative
Seems pretty interesting. In terms of how it works it seems similar to how LaunchDarkly fetches its feature flags.
In practice if we configured all small bits of data in here it'll happen at app startup and be on the critical path. Do you have some sense about the latency there?
Latency was around ~200ms (I believe ~40ms is on the server). Do you feel it's important to push this number down?
I think LaunchDarkly might do some background fetching. We were slightly concerned about additional bandwidth / battery usage on mobile for this pattern and aren't quite ready for a push pattern.
Imagining a mobile app, adding a 200ms delay to a screen transition that would otherwise not fetch data would not be ok. If it fetches other data, it may be fine. I would rather have the relevant values fetched in the background before they are read.
Because of the latency sensitivity I would probably try to hack this together on cloudflare workers+KV if I needed it. I would expect <100ms latency in most cases on that.
I think this is a general worthwhile service, especially the focus on CMS/copy over feature flag tools, but low latency would be something I would look for in a feature list.
That's something we can definitely give more priority to.
I actually had an iOS library version that would poll infrequently in a background thread and had a synchronous API. Something like:
Configly.init(API_KEY, { values: [keyOne, keyTwo]}) // (other code runs) print(configly.shared().get('keyOne')) // would be cached by the background thread
but was slightly concerned about unwanted bandwidth/battery usage for mobile users but perhaps that mode would be useful exactly for the situation you describe.
Does anyone really care about a couple hundred KB (at most) these days? Or am I underestimating the config size/usage?
>I think if battery/data even becomes a concern, you have already put too much data into config and probably need a database? > Does anyone really care about a couple hundred KB (at most) these days? Or am I underestimating the config size/usage?
I could be wrong but I think this is a concern some mobile developers have. It came from user feedback but we should definitely look into it more.
Great that there's a free model, but would love to see a `hobbyist` tier as well. 50 QPS won't cut for a lot of folks.
edit: forgot a word
You could think of this as Redis hosting (configured to be durable!) + UI with features like version history, lightweight type checking (and potential for user accounts, schema enforcement) + client libraries on a variety of languages for super easy install / integration with all of your frontends. The libraries are smart with things like caching + a team focused on improving this feature set / functionality.
I was just thinking that what we really want when we say "no-code" is the ability to think in terms of domain specific data structures instead of programming constructs.
If you lose internet while using it, the values could be cached and it will work well.
We have a graceful degradation feature on the roadmap; something like hard-coding fallback values in case of offline issues like this. Something like:
configly.init(API_KEY, { default_values: { price: '$1,000,000', upgrades: ['AC', 'Hot rod red'], } )
What do you think?
> Databases can do this but often aren’t used that way for good reasons (they can be cumbersome to wire-up, there are scale concerns about adding extra load to your DB, it’s risky to touch a production database, etc).
I can think of other benefits; you generally don't want really anyone touching your prod DB directly -- but _especially_ non engineers. So what if they want to update copy? You could build or leverage a web UI... but now you're going down the path of building Config.ly. You also don't get version history for free with most databases. And once a value is in the database, you also need to worry about the middle layer of getting that value to your clients and having your clients fetch it intelligently/caching, etc.
The hope is that these and more features for Config.ly along with the fast integration will make it a no-brainer over rolling your own implementation as many folks do today.
It ought to be straightforward to add Config.ly as a backend, which would give you a pathway into a very large developer population (both Java+Spring and .NET via Steeltoe[1]).
For GUI cases, Spring Cloud Azure[2] adds Azure App Configuration[3] as another backend.
Disclosure: I work for VMware, which sponsors Spring development, but not on Spring.
[0] https://cloud.spring.io/spring-cloud-config/reference/html/#...
[1] https://steeltoe.io/app-configuration
[2] https://spring.io/projects/spring-cloud-azure
[3] https://docs.microsoft.com/en-us/azure/azure-app-configurati...
I view Config.ly as being useful for _anything you'd put in a class variable_. For example text copy or styling. And if you put it in Config.ly instead of hardcoding, you can avoid deploying which can be slow (e.g. for iOS it's days) -- and potentially even avoid having developers do the work altogether.
Does that make sense or do you view it differently?
I'm not sure if that answers your question. It may be referring to slightly different functionality... We don't yet have functionality to say "for this key, deploy value x to clients a,b,c and value y to clients d, e, f" but it's on the roadmap. Do you think that'd be important?
Is there a size limit, do clients download changes or entire file?
All of the values can be fetched across projects / clients, it's essentially a simple K:V store with broad libraries. For example, if you have a key "price" whose value is a number "100", you can call:
configly.get(price)
from all your clients (provided they are all using the same API KEY).
Today, clients download at the granularity of an entire key-value. So if you changed that price to "150", it'd fetch the entirety of "150" and not just the digit flip. Were you envisioning a case of storing a lot of data?
Today, our free service is capped at 100kb total. Was there a use case you had in mind?
In a Enterprise, where there are multiple teams wanting to manage their own K:V store, having a global K:V is helpful. Also being able to refer to a project to refer to their K:V
if key(“price”) = “100” is set in Global and one of the projects is setting it again to a different val or same show a warning that you’re rewriting that.
K:V would be: testing_data: { exposure: 0.10, colors: ['green', 'red'], }
// on the client:
function getColor() {
configly.get('testing_data, function(data) { const roll = Math.random(); const index = roll > data['exposure'] ? 0 : 1; return data['colors'][index]; });
}
re: global K:V. We plan on introducing teams that would work exactly that way!
Thanks!
- Updating content is way simpler. Even non technical folks can do it. (and soon you'll have revision history)
- I think with the S3 library you can use HTTP caching; Config.ly can do smarter caching (e.g. if you fetch (a,b) and then just a, HTTP caching would fail).
I'm not sure if I did a great job of explaining that last use case :/
This type of tool is one of those things that you don't think you need, until you see it. Once you see the tool, you start seeing countless places in your work where you realize that a tool like this is extremely powerful. I just played around with config.ly, and I have to give major kudos on the ease of setup and use. Really great product!