After many years in those trenches, I built Vyral to try and solve that problem: it's an open-source framework for building locally using stable and provider-portable contracts. When ready, select the provider that best fits the moment, knowing that you can switch or expand more readily rather than more painfully in the future.
You can try it out locally from a source checkout using the following command and have records/objects, retrieval, and durable execution up and running in minutes: ./scripts/vyral
Provider-native behavior isn't universally portable, so I've focused on what is best reproduced across implementations. Vyral is honest about where the seams and limitations are, and adapters must be qualified explicitly via evidence-backed results.
Sound good? I'd love to hear about how you've handled provider lock-in, and your thoughts on Vyral's contract design.