Revisits: Opencode and Resend

Published: Mar 20, 2026 by Isaac Johnson

In a post last year, I looked briefly at Opencode, comparing it with Claude Code, and said then, “circle back… I want to explore some of its other features like agent model and maybe MCP servers.”. Opencode is still quite active so let’s give it a shake and compare the free models to using it with a paid one like Gemini.

Also, last year I looked at Resend for sending emails. Because it lacked SMTP, i really just use it in apps or via curl. Let’s review how to add custom domains and see if perhaps it has some new features.

Resend

Back in September 2025 I said goodbye to Sendgrid and revisited Resend. I just touched on it then, as well as back in 2023 as I had other options in hand.

If you have never used Resend before, you can create an account. For federated IdPs they have Google and Github.

As I mentioned in the past, this is not just some freemium SMTP relay - they will send emails, but only via API calls.

So our first step is to create an API key

/content/images/2026/03/resend-01.png

I can then use that API key in an email:

$ curl -X POST 'https://api.resend.com/emails' \
  -H 'Authorization: Bearer re_XXXXXXXXXXXXXXXXXXXXXXXX' \
> -H 'Content-Type: application/json' \
  -d $'{
    "from": "onboarding@resend.dev",
    "to": "isaac.johnson@gmail.com",
    "subject": "Hello FB 2026!", "html": "<h1>hello friend</h1><p>Congrats on testing Resend again!</p>"}'
{"id":"84dd43f8-21ef-4588-b69a-c2cab03c342f"}

We can see it sent right away:

/content/images/2026/03/resend-02.png

As I reviewed it today, however, I noticed a new SMTP section that was not there in the past

/content/images/2026/03/resend-03.png

Could it be? Did they add SMTP (Now I really do have a drop in replacement for Sendgrid!)

Let’s test with SWAKS. I’ll add SWAKS if missing

$ sudo apt update && sudo apt install swaks
[sudo: authenticate] Password:
Hit:1 https://us-central1-apt.pkg.dev/projects/antigravity-auto-updater-dev antigravity-debian InRelease
Hit:2 http://security.ubuntu.com/ubuntu questing-security InRelease
Hit:3 http://us.archive.ubuntu.com/ubuntu questing InRelease
Get:4 https://repository.mullvad.net/deb/stable stable InRelease [3,536 B]
Hit:5 http://us.archive.ubuntu.com/ubuntu questing-updates InRelease
Hit:6 http://us.archive.ubuntu.com/ubuntu questing-backports InRelease
Fetched 3,536 B in 1s (2,394 B/s)
123 packages can be upgraded. Run 'apt list --upgradable' to see them.
Notice: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://us-central1-apt.pkg.dev/projects/antigravity-auto-updater-dev antigravity-debian InRelease' doesn't support architecture 'i386'
Installing:
  swaks

Installing dependencies:
  libdigest-bubblebabble-perl  libnet-dns-perl         libsocket6-perl
  libdigest-hmac-perl          libnet-dns-sec-perl
  libio-socket-inet6-perl      libperl4-corelibs-perl

Suggested packages:
  libauthen-ntlm-perl  perl-doc

Summary:
  Upgrading: 0, Installing: 8, Removing: 0, Not Upgrading: 123
  Download size: 558 kB
  Space needed: 1,754 kB / 718 GB available

Continue? [Y/n] Y
Get:1 http://us.archive.ubuntu.com/ubuntu questing/main amd64 libdigest-bubblebabble-perl all 0.02-3 [6,724 B]
Get:2 http://us.archive.ubuntu.com/ubuntu questing/main amd64 libdigest-hmac-perl all 1.05+dfsg-1 [8,416 B]
Get:3 http://us.archive.ubuntu.com/ubuntu questing/main amd64 libsocket6-perl amd64 0.29-3build4 [17.6 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu questing/main amd64 libio-socket-inet6-perl all 2.73-1 [14.7 kB]
Get:5 http://us.archive.ubuntu.com/ubuntu questing/main amd64 libnet-dns-perl all 1.50-1ubuntu1 [340 kB]
Get:6 http://us.archive.ubuntu.com/ubuntu questing/main amd64 libnet-dns-sec-perl amd64 1.26-1build1 [40.6 kB]
Get:7 http://us.archive.ubuntu.com/ubuntu questing/main amd64 libperl4-corelibs-perl all 0.005-1 [38.1 kB]
Get:8 http://us.archive.ubuntu.com/ubuntu questing/universe amd64 swaks all 20240103.0-2 [92.4 kB]
Fetched 558 kB in 1s (409 kB/s)
Selecting previously unselected package libdigest-bubblebabble-perl.
(Reading database ... 342210 files and directories currently installed.)
Preparing to unpack .../0-libdigest-bubblebabble-perl_0.02-3_all.deb ...
Unpacking libdigest-bubblebabble-perl (0.02-3) ...
Selecting previously unselected package libdigest-hmac-perl.
Preparing to unpack .../1-libdigest-hmac-perl_1.05+dfsg-1_all.deb ...
Unpacking libdigest-hmac-perl (1.05+dfsg-1) ...
Selecting previously unselected package libsocket6-perl.
Preparing to unpack .../2-libsocket6-perl_0.29-3build4_amd64.deb ...
Unpacking libsocket6-perl (0.29-3build4) ...
Selecting previously unselected package libio-socket-inet6-perl.
Preparing to unpack .../3-libio-socket-inet6-perl_2.73-1_all.deb ...
Unpacking libio-socket-inet6-perl (2.73-1) ...
Selecting previously unselected package libnet-dns-perl.
Preparing to unpack .../4-libnet-dns-perl_1.50-1ubuntu1_all.deb ...         ]
Unpacking libnet-dns-perl (1.50-1ubuntu1) ...                                ]
Selecting previously unselected package libnet-dns-sec-perl.                    ]
Preparing to unpack .../5-libnet-dns-sec-perl_1.26-1build1_amd64.deb ...           ]
Unpacking libnet-dns-sec-perl (1.26-1build1) ...                                     ]
Selecting previously unselected package libperl4-corelibs-perl.
Preparing to unpack .../6-libperl4-corelibs-perl_0.005-1_all.deb ...                   ]
Unpacking libperl4-corelibs-perl (0.005-1) ...                                          ]
Selecting previously unselected package swaks.                                            ]
Preparing to unpack .../7-swaks_20240103.0-2_all.deb ...                                     ]
Unpacking swaks (20240103.0-2) ...
Setting up libperl4-corelibs-perl (0.005-1) ...
Setting up libdigest-hmac-perl (1.05+dfsg-1) ...
Setting up libsocket6-perl (0.29-3build4) ...
Setting up swaks (20240103.0-2) ...
Setting up libdigest-bubblebabble-perl (0.02-3) ...
Setting up libnet-dns-perl (1.50-1ubuntu1) ...
Setting up libio-socket-inet6-perl (2.73-1) ...██████████████████████████▎                 ]  Setting up libnet-dns-sec-perl (1.26-1build1) ...
Processing triggers for man-db (2.13.1-1) ...

Let’s give it a try (I’ll remove parts that show my auth in output)

$ swaks --to isaac.johnson@gmail.com --from isaac@steeped.space --server smtp.resend.com:587 --auth LOGIN --tls --auth-user resend --auth-password 're_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
=== Trying smtp.resend.com:587...
=== Connected to smtp.resend.com.
<-  220 Resend SMTP Relay ESMTP
 -> EHLO LuiGi
<-  250-Resend SMTP Relay Nice to meet you, [10.0.31.199]
<-  250-PIPELINING
<-  250-8BITMIME
<-  250-SMTPUTF8
<-  250-AUTH PLAIN LOGIN
<-  250-STARTTLS
<-  250 SIZE 41943040
 -> STARTTLS
<-  220 Ready to start TLS
=== TLS started with cipher TLSv1.3:TLS_AES_256_GCM_SHA384:256
=== TLS client certificate not requested and not sent
=== TLS no client certificate set
=== TLS peer[0]   subject=[/CN=*.resend.com]
===               commonName=[*.resend.com], subjectAltName=[DNS:*.apps.resend.com, DNS:*.resend.com, DNS:resend.com] notAfter=[2026-03-31T14:56:52Z]
=== TLS peer[1]   subject=[/CN=*.resend.com]
===               commonName=[*.resend.com], subjectAltName=[DNS:*.apps.resend.com, DNS:*.resend.com, DNS:resend.com] notAfter=[2026-03-31T14:56:52Z]
=== TLS peer[2]   subject=[/C=US/O=Let's Encrypt/CN=E8]
===               commonName=[E8], subjectAltName=[] notAfter=[2027-03-12T23:59:59Z]
=== TLS peer certificate passed CA verification, passed host verification (using host smtp.resend.com to verify)
 ~> EHLO LuiGi
<~  250-Resend SMTP Relay Nice to meet you, [10.0.31.199]
<~  250-PIPELINING
<~  250-8BITMIME
<~  250-SMTPUTF8
<~  250-AUTH PLAIN LOGIN
<~  250 SIZE 41943040
 ~> AUTH LOGIN
<~  334 xxxxxxxxxxxxxxxxxxxxx
<~  334 xxxxxxxxxxxxxxxxxxxxx
<~  235 Authentication successful
 ~> MAIL FROM:<isaac@steeped.space>
<~  250 Accepted
 ~> RCPT TO:<isaac.johnson@gmail.com>
<~  250 Accepted
 ~> DATA
<~  354 End data with <CR><LF>.<CR><LF>
 ~> Date: Fri, 20 Mar 2026 07:39:16 -0500
 ~> To: isaac.johnson@gmail.com
 ~> From: isaac@steeped.space
 ~> Subject: test Fri, 20 Mar 2026 07:39:16 -0500
 ~> Message-Id: <20260320073916.039869@LuiGi>
 ~> X-Mailer: swaks v20240103.0 jetmore.org/john/code/swaks/
 ~>
 ~> This is a test mailing
 ~>
 ~>
 ~> .
<~  250 f23f9f1d-4a40-4dc3-bdd5-820130ab4e07
 ~> QUIT
<~  221 Bye
=== Connection closed with remote host.

However, I never saw it come through. In fairness, I let steeped.space go so perhaps Google blocked it?

I then noticed Resend blocked it now

/content/images/2026/03/resend-04.png

I delete the expired and started the process to add a new one

/content/images/2026/03/resend-05.png

I’ll need to set some records for verification

/content/images/2026/03/resend-06.png

While it said it might take a day to verify, it took less than 30m to come back verified

/content/images/2026/03/resend-07.png

I’ll give it a shot

$ swaks --to isaac@freshbrewed.science \
--from isaac@steeped.space \
--server smtp.resend.com:587 \
--auth LOGIN --tls \
--auth-user resend \
--auth-password 're_xxxxxxxxxxxxxxxxxxxxx'

And it worked just fine!

/content/images/2026/03/resend-08.png

We can also see that as a positive result in the logs of Resend

/content/images/2026/03/resend-09.png

Resend, sadly, just has a $0, US$20, and US$90 plan available today

/content/images/2026/03/resend-10.png

I really wish vendors would embrace the home-lab type people that just want some more domains but are fine with lesser limits. I would be keen on a $5 or perhaps even $10 a month plan, but not $20 - just for sending mails.

Opencode

Back in August this past year I looked at Opencode. It worked okay with Gemini 2.5 but I was leaning into Qwen3 and Gemini CLI at the time.

It’s still quite active - let’s give it another shot.

$ curl -fsSL https://opencode.ai/install | bash

/content/images/2026/03/resend-11.png

Let’s see if we can get it to help build an agent skills markdown file for python work:

So, as you saw, using the free MiniMax M2.5 Free model it took a good 10m - but free is free.

If we set a GEMINI API Key, we can use the Google models as well

/content/images/2026/03/opencode-13.png

One issue I noticed is the new “SKILL” made is it omitted the YAML block at the top of the SKILL.md so it doesn’t show up when list skills.

I’ll add it myself to ~/.agents/skills/python-app-setup/SKILL.md

---
name: my-python-app-skill
description: When I ask for my python process, or my python skill, follow these rules.  Use this skill whenCreating a new Python application, Scaffolding a Python project, Setting up a new FastAPI or FastMCP project, or Initializing a Python project from scratch
metadata:
  copyright: Copyright Freshbrewed. 2026
  version: "0.0.1"
---

Now when I fire up OpenCode I can see it listed

/content/images/2026/03/opencode-14.png

However, with Gemini 3 flash, it got hung up on some loops - it was working, just kind of got a bit stuck

I got MiniMax working, but of course as a free model its quite slow

/content/images/2026/03/opencode-16.png

I fired up the app it created

$ uvicorn app.main:app --reload

I mean, the layout looks fine but now way to add notes which is a bit of an issue

/content/images/2026/03/opencode-17.png

I switched to Gemini Pro to try and fix things. One thing we’ll note in Opencode is the running cost in the upper right. This can be handy if really focused on spend

/content/images/2026/03/opencode-18.png

This is important as using the Pro model to fix my ask (and I didn’t need to - Flash would have been fine) would cost me $0.29

/content/images/2026/03/opencode-19.png

Here we can see it in action!

There is a Dockerfile, which was a requirement from the skill we built

$ cat Dockerfile
# 411
FROM python:3.11-slim

WORKDIR /app

COPY --from=build /app/dist /app

EXPOSE 8000

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

And there exists a SYSTEM.md with a diagram as I desired for the architecture

/content/images/2026/03/opencode-20.png

Of course, sharing is caring, so publishing to Github is next.

You can find the repo at https://github.com/idjohnson/simpleTodo.

Where the mermaid renders in browser without issue

/content/images/2026/03/opencode-21.png

Summary

Today we looked at Resend again and were pleasantly surprised to see they added SMTP support. I added a new domain and tested sending with SWAKS. We wrapped by discussing costs for their paid tier

Then we circled back to Opencode to give it a good try and use it to build a skill, then use the skill in an agentic flow to build, of course, a to-do app. We wrapped it up by fixing it with Gemini Pro, looking at costs, and pushing the resulting app to Github.

I didn’t dive into too much as I don’t want to always promote Google uber alles.. but one of the biggest reasons I lean in on Gemini CLI over tools like Codex and Opencode is how it caches tokens. HUGE savings (and that matters to me). So as you saw, fixing a hole in the app was quick with Gemini Pro in Opencode, but with no token caching, that cost US$0.29 (no worries, i had some credits to cover that). I cannot be certain, but my experience with caching in the past would suggest i would have spent a third of that had I used Gemini CLI.

I do think the use of Skills is a topic we need to followup on. Just this last night the topic of MCP vs Skills came up again and there was a fun passionate debate on usage and pros/cons. Stay tuned for my take on that soon.

Opensource Opencode Minimax Genai Gemini Resend Email

Have something to add? Feedback? You can use the feedback form

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes