Launch HN: Gallery (YC S21) – On-demand environments on any cloud provider
Engineers typically have a fixed number of cloud environments, including production, staging, and maybe some additional pre-production environments. They use these to preview features, share work with other team members, do manual QA/automated testing, and more. As the number of engineers grows, having a fixed number of cloud environments becomes a bottleneck. Teams end up queuing for access to staging and so on. Creating additional environments and keeping them in sync, though, is a major headache, especially when the environments are reasonably complex.
When this problem reaches a boiling point, teams either have to slow down feature development, test on production, or deal with building their own on-demand platform internally. That’s where we come in. We enable on-demand spinup of unlimited environments for quicker development. Engineers use these as environments-per-feature—in parallel—to share previews with QA/other engineers/product people, to create demo environments for clients with features that aren't in production, to run automated testing on ephemeral environments as part of their CI processes, and more.
Vignesh and I are engineers with experience in infra/research at Facebook/Apple/Microsoft. We met as roommates at Caltech. We got into YC with a very different idea (a way for stores to ask customers questions and offer instant recommendations/promotions based on their responses) but soon abandoned it (it was more exciting to us as a technical challenge than to stores as a practical solution) and found ourselves testing different ideas as quickly as we could.
During this period, right before every launch without fail, Vignesh and I would collide on staging: features that worked locally would break on prod infra. We tried to provision our own individual staging environments, but setting them up and keeping them in sync sucked up valuable bandwidth. The gold-standard workflow, in my mind, was the one-click “On-Demand” environment provisioning I’d had at Facebook, wherein I could click a button and instantiate a live feature preview. We found solutions that promised on-demand environment spin-up, but none of them worked for us; they were either incompatible with our stack (mostly built around App Engine), didn't interface with our cloud provider, or required too much overhead and finessing to set up.
This was the seed for our idea. Talking to larger startups, we realized that the inconveniences we faced were just a few of the major pains faced by bigger engineering teams with nascent DevOps; they often had brittle, scattered workflows around managing their environments and growing queues for features. They needed a solution to flexibly create, destroy, and replicate environments, through both ad-hoc and developer triggers like PR’s and CI builds. While there are a number of existing services that aim to simplify DevOps and/or provide easier workflows around environments, engineering teams we spoke to were either unable or unwilling to use them due to incompatibility with their specific setups.
We realized that a better approach would be to abstract away the specifics of each environment by using infra-as-code as middleware. Infra-as-code solutions like Terraform, CloudFormation, etc. can represent infrastructure thoroughly in a standardized fashion. The majority of people we talked to were maintaining their infrastructure using Terraform or something similar, and it was easy to build out pipelines for those who didn't by using Terraform under the hood. This was the key to what became Gallery.
Since every company manages their environments differently (cloud provider, use of K8s or infra-as-code, cl...
22 comments
[ 9.4 ms ] story [ 188 ms ] threadThe reason we have a read-only demo is because of the friction required to set up an account (you have to link your cloud account and repositories); we felt that the read-only account was the easiest way to take a look at the features without needing to go through the account creation process.
This is the real product I'd pay for. The networking world has plenty of awesome tools that let you just log in to prod, make the change you need, and an automated system comes along later and dumps the configs to source control and documents the changes. Let engineers move quickly and change stuff in prod, you update the terraform and keep everything synced in dev/test/etc.
What you're proposing here sounds like it falls under the Continuous Previews umbrella that we've been collaborating with others to define and refine via the Continuous Previews Manifesto.
Awesome to see others finding the same value proposition in the process. We think there's space for several interpretations of CP and we see value in the implementation you're proposing.
If you're interested in collaborating please reach out.
I'm wondering if the better way to solve this problem would be to use docker-compose files (or k8s definitions), since we all have them checked in already for use with local development. I really just need a way to fire the local environment up on a server so I can send someone a link to it that will work for a while (and not die when I close my laptop). I don't need the full onslaught of AWS (or GCP services) when I just want to send someone a link and ask them if this CSS looks right (or put the link in a PR), but I need it to work better than a picture.
The docker-compose approach is a valid angle — we’ve seen a couple products built around that workflow. A weakness that led us to our approach is that they generally lack support for projects that involve cloud-specific services. Most of the startups we’ve talked to already have some infra-as-code that describes their cloud infrastructure, and we’re rolling out support for CloudFormation/Pulumi very soon, so customers will be able to bring over infrastructure in any major format. As far as limiting the breadth of services spun up, we've found that removing unnecessary services from the IaC config provides reasonably good results. We plan on adding support for a Docker-compose approach soon, but we felt that starting with IaC would bring us better generalizability out of the gate.
It's maybe fine to post one comment about your competing service—maybe. (I'm not even sure about that, to be honest, but people do it.) Pushing the envelope beyond that is too much.
Btw, this applies to all startup launches, not just YC companies, and we moderate other threads exactly the same way when we see this dynamic. From my perspective it's about the kind of community we want HN to be.
Non-launch threads are different of course. I'm sure your work is very good and you're completely welcome to participate on HN.
I've detached this comment from https://news.ycombinator.com/item?id=29166416.
I'm trying to share that much of what is described in the post and discussion is currently being formalized - and there are different interpretations and technical solutions that various teams including what gallery is proposing.
Do you guys plan to handle managing instances created via terraform code via Gallery, or is it strictly a tool to instantiate environments and add triggers around it?
Like I'm thinking of cases where you might want to edit your existing env created by Gallery with other stuff that other teams may have worked on and merged onto prod. If I edit the config, there could be a lot breaking changes
I would add one more thing (and this is maybe for down the line): There's a use case for duplicating envs beyond just development environments. There's a lot of value in cases where the SaaS product itself requires on-demand environment generation. Where customers of it need staging instances so they can see what config changes are before they merge to production. Obviously in that case, you're treating an actual product like a terraform provider, and the API's of that product as resources. I would explore that down the line because there's a lot of value in a service like that.
FYI, I would love to get involved any way I can to help you guys grow this. Let me know how I can help! mailto:ramish@ualberta.ca if you're interested :)
The problem you're trying to solve definitely exists, don't get me wrong; but the level of effort required to integrate with your service sounds more like a high-touch consultant-level engagement (definitely sounds enterprise-y and expensive). I'm not sure how you can scale this as a self-serve SaaS business.
Using IaC helps a lot with the former, and getting experience onboarding different clients has helped with the latter - we're now familiar with common hangups (e.g. figuring out the data layer), and we've built processes into the product to get around those (e.g. immediately populating a test DB from a specified staging DB). We've seen progress in how quickly we can get people onto the platform; it now generally only takes a day, and we're bringing full self-service in sight as that duration decreases.
That being said, our broader goal is to hit the larger enterprise market, for which (as you mentioned) a higher-touch approach is warranted.
If I already have a parametrized set of Terraform scripts for creating an environment, what is stopping me from spinning up and tearing down my own ephemeral environments in my CI pipeline? This is what we're doing today and it works pretty well.
What is this tool actually providing? I feel like there's something fundamental I'm misunderstanding.