Welcome to the Codelexy field notes
A new home for the practical Data, Cloud, and CRM work we do at Codelexy. Updated weekly.

Contents3 sections · 3 min
This is the first post on the Codelexy field notes. We'll write here about the practical work we do for small and mid-sized businesses — the stuff that's specific enough to be useful, but general enough to apply across clients. No growth-hack lists, no algorithm-bait headlines. Just the work, written down.
Every team eventually ships its own version of the same five systems. A way to take in leads. A way to talk to customers. A place where data goes to die. A pipeline that nobody trusts. And a cloud bill that nobody can quite explain. We've been on the other side of that work for long enough to have opinions, and to know which opinions are worth holding loosely.
What you can expect
Three lanes, each tagged so you can subscribe to just the parts you care about.
- Cloud — AWS, GCP, Azure, OCI. Cost-vs-benefit walkthroughs, real-world architectures, migration patterns that don't require rewriting your auth system.
- CRM — Salesforce, HubSpot, Zoho. Integration patterns, data-quality hygiene, lifecycle automation. The unglamorous wiring that makes the rest of the stack useful.
- Data — Pipelines, warehousing, analytics, ML. Cheaper-first ways to get value out of the data you already have, before you go shopping for the data you don't.
How a post gets here
Every post is a Markdown file in a git repo. Drafts get reviewed in a pull request. Merging to main runs CI that pushes the post into our CMS as a Draft. An editor reviews it once more in the editorial workflow, then publishes. From your click to the live page, the path is:
// Strapi 5: upsert by gitPath, always Draft until a human clicks Publish.
const existing = await api(
`/posts?filters[gitPath][$eq]=${encodeURIComponent(file)}`
);
if (existing.data.length > 0) {
await api(`/posts/${existing.data[0].documentId}`, {
method: 'PUT',
body: JSON.stringify({ data: { ...payload, publishedAt: null } }),
});
} else {
await api('/posts', {
method: 'POST',
body: JSON.stringify({ data: { ...payload, publishedAt: null } }),
});
}What we won't do
We won't write SEO bait. We won't pad a 400-word point into a 2,000-word "ultimate guide." We won't summarise other people's work and call it ours. And we won't run third-party trackers on these pages — no Google Analytics, no Facebook pixel, no marketing-automation script1. Just the writing.
The chaos isn't a thing. The chaos is what fills the empty space where a system should be.
If a piece is useful to you, the best thing you can do is reply with what you'd want us to write about next. There's a feedback widget at the bottom of every post; we read every note.
— The Codelexy Team
Footnotes
-
We do append an entry to a JSONL file on disk when you submit a lead form. That's the durable record, and it never leaves our VM. The whole data flow is documented in the architecture doc. ↩