

Jay Long
Software Engineer & Founder
Published March 7, 2026
Before I get into the n8n stuff, I want to talk about how I actually use these different AI tools together, because I think my workflow is pretty deliberate at this point. I use different models for different stages of work, and it's not random.
I prefer XAI's Grok models for blog-related tasks. Grok is just superior for talking about stuff. It has a great general understanding of things and produces natural-sounding output. So I'll start chatting with Grok, and as I start to firm up a strategy and a plan, once I get a directional orientation, once intent starts to emerge, I flip over to GPT and have a deeper technical conversation about the engineering, the business strategy, the design. I get by far more meaningful results from GPT for that kind of work.
Then once we've firmed up a plan of action, I open up my IDE and have a planning conversation with Claude Code. Claude is the most consistently superior coding model. It's rarely beaten. And it has the context of my codebase, so I'm not just designing theoretical logic with example snippets. We can actually talk about exactly what we're going to do to the codebase, what exact patterns we're going to follow, what exact changes we're going to make. From there I give Claude Code a fair bit of agency and let it pretty much run. I watch it in case it's doing anything majorly stupid, and a lot of times it asks clarifying questions, which it's real good about. I accept what it builds unless something glaringly obvious stands out.
Once the feature is built, I use Cursor for revisions and debugging. I'm also considering paying for GitHub Copilot to handle security checks, bug checks, and test writing autonomously in the cloud. Let debugging be handled asynchronously while I move on to the next thing.
A lot of this is still me locking in n8n fundamentals. One thing that tripped me up initially was credentials. A credential in n8n is an object that stores credentials, but the credential TypeScript file itself doesn't contain anything sensitive. You might think you'd need to gitignore it because it has API keys in it. It does not. It's code that defines an object in the n8n interface where you can store those sensitive strings and other configuration. The actual API key gets stored in the n8n database and is retrieved when interfacing with the API at runtime.
So for my workflow, I created two credentials: an XAI credential for the Grok API key, and a CyberWorld credential for authenticating against my website's API. That API key is just something I generated with a bash command, a simple key generation algorithm. My Next.js app stores that key and uses it to authenticate protected API requests.
One thing I noticed: where and how n8n stores these credentials internally might be an interesting security research project. They can't hash them like passwords because they need the plaintext to actually make API calls. Worth investigating.
The workflow itself is super simple right now. Manual trigger, because I'm still putting this on training wheels with strict guardrails so I can carefully watch every step and make sure everything is solid. The end goal is an automatic trigger, but not yet.
The manual trigger fires off the first custom node: get next unprocessed transcript. This one connects to my CyberWorld API, which is my website. It hits an endpoint that retrieves a list of transcripts that are raw, uncleaned, haven't been touched yet. It pops one off the list and claims it, puts it in a claimed state so that when this is automated, we don't have two nodes working on the same transcript. There's probably a node in the marketplace that already does something like this, but I can create these things so fast that sometimes I just code them out. If it's going to take a few seconds, I just do it.
That node grabs the transcript text and some other data, then sends an output object to the second custom node: the transcript cleanup agent. This is where the magic happens. It uses the XAI credential to call the Grok model programmatically. It ingests the output from the get-next node and sends the transcript text along with a carefully crafted prompt to the XAI API.
Grok fixes spelling, removes vocal tics and repetition. One problem with speech-to-text transcripts is they process linearly, one word or phrase at a time, so they don't catch a lot of simple spelling issues. Grok has the full context of the entire text, so it understands when I mention some technology product that might have a weird spelling. It does a pretty good job. It worked better than the GPT model I tried before, didn't have the timeout issues, and it was the model I wanted to use in the first place. I'm glad I had this breakthrough before I had to go to sleep last night.
A lot of this has been a practice of automating things I'm already doing manually. I think that's usually the best way to go. Get a manual workflow down first, and wait for two things. One: how sure can I be that this is something I need to repeat over and over? That signals value for automation. Two: what exactly do I need to be doing? Because you'd be surprised. You'll think of things to automate, and even with all these tools making it as simple and fast as possible, it can still get time consuming, especially if you don't already have your process mapped out.
You'll go down rabbit holes and get turned around thinking of things you could add to it. It's very tempting. You need to lock in what exactly you're automating before you begin trying to automate it. Simplify the process first.
What I've noticed doing this manually is that the cleaned-up transcript the LLM produces is always superior to the raw transcript the voice memo app produces. So the decision I'm making is: do I overwrite the raw transcript, or do I save them both? I don't think it's necessary to save both. Once I claim it and get Grok to clean it, I can just override it. That becomes the canonical, accurate raw transcript text. All we want this step to do is clean up the transcript, because I do want to save these transcripts as a historical record of what I actually said.
Then I need to decide whether to keep appending new fields to the transcripts table or make a new normalized table that's relational. I'm leaning toward just appending new fields for now, because I don't want to over-normalize and end up with a pile of relational tables. But I can also see that transcripts will accumulate a good number of fields over time. Another step I want to add in a future node is extracting keywords, topics, and ideas from the text, coming up with a title.
I'm honestly conflicted. I can talk myself into three different paths. One: pile everything onto the transcripts table, including the final blog article and title. Two: as soon as we've got the cleaned-up transcript, pivot to a posts or articles table and start tacking fields onto that. Three: somewhere in between, where we draw a line and say these fields go with transcripts and these go with articles. But I do feel like two tables is the right call. Transcripts are not necessarily one-to-one with articles. We may not know that for sure until I've piled up a good amount of both, but I think we're going to find that articles end up looking very different from transcripts.
As I'm building out this whole pipeline, I keep coming back to this idea. It has the efficiency of an assembly line, but it doesn't have the uniformity. It's got a lot more flexibility and novelty. That's historically been a trade-off.
Think about it like a mantle or a staircase. You could have a woodworking craftsman carving these things by hand. There's not another one that exists in the world. It's a custom, unique, handcrafted work of art that's part of your house. Or you could go to Lowe's and buy something mass-produced that comes in a box. The people installing it aren't craftsmen, they're hourly construction employees who have assembled a thousand of these and can pop them out like nobody's business. Great deal on the installation.
If you wanted something custom and novel, you hired the craftsman, paid an enormous amount, and expected them to spend a lot of time on it. If you wanted something cost-effective and fast, you traded the novelty and bought something manufactured. In order to build something fast and cheap, you needed an assembly line where everything is done the same way.
What's interesting about what we're building here is we get to have our cake and eat it too. AI makes it possible to create workflows that run like a well-oiled machine, but we're feeding novelty into it from the start. I can pop out blog articles fast, but they're still going to have humanity in them, because the raw input is me talking, thinking out loud. The automation handles the tedious cleanup. The voice stays mine. And I can change the entire pipeline instantly, cheaply, quickly. That's the part that breaks the old trade-off.