{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreiasgnjg55qaym2fv3tyx4eury637gu2bbbikms33vljmehtvm5cuy",
"commit": {
"cid": "bafyreifanoany2fyhhvu32i5uiv7jluety5tk5nltzyaf4dqemlzrcdwlm",
"rev": "3moavqvzyzc2n"
},
"uri": "at://did:plc:dgtaz4vldacvqhvvmdvoc4ad/app.bsky.feed.post/3moavqvvlb22l",
"validationStatus": "valid"
},
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "It's been a while since the last log, but I haven't been idle. Haven't had as much time as I'd like to work on this project - having a full time job and all that - but much of it is at what I consider to be done™. What I mean by that is that these features are ok for me to use and polish as I encounter rough edges"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "Status"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Payment infrastructure"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Authentication"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Queues, Schedules etc"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Api Key management"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ MCP server"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Common"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Domain verification"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Multiple providers (smtp, resend, sendgrid, mailgun, ses)"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ API usage"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Relay"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Captcha verification"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Webhooks"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Redirection"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Form"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ List management"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Campaign management (i.e. bulk email sending)"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "✅ Api Usage"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "News"
}
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "So as you can see there's a lot of stuff here; I'm still figuring out the last steps (i.e. how much I want to bother automating deploying new versions to production) but all in all I think that's enough for a product."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "Why am I doing this, again?"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Because I needed this tool for some of my other projects (including my newsletter). There's lots of projects where I just need to have a way to send emails or to have subscriber lists without needing to have a dedicated database just for that (think a SSG)"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "What's next?"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Short answer: testing, testing & more testing."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Long answer:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "figuring out how to deploy this app"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "figuring out how to automate the process as much as I want to"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "testing it on my own projects"
}
}
]
}
}
],
"id": "019ec659-1cce-7555-8684-8d616cf07525"
}
]
},
"description": "",
"path": "/3moavqoiq5s24",
"publishedAt": "2026-06-14T13:45:41.845Z",
"site": "at://did:plc:dgtaz4vldacvqhvvmdvoc4ad/site.standard.publication/3m7iwa2i6us22",
"tags": [
"devlog",
"facteur"
],
"title": "Facteur EP 2: Status Update"
}