Bespoke Software Solutions

Our Tech Insights & Articles

Notify — Building a Serverless Expense Reminder
Serverless | Cloud | Automation
October 2025 • Serverless • Cloudflare Workers • R2 • Resend

TL;DR: Notify reads an Excel file from Cloudflare R2, groups expenses, and emails reminders the day before they’re due. It’s lightweight, serverless, and inexpensive — powered by Cloudflare Workers and Resend.

View More

The problem

Missed payments calendar

Missed payments are a common, low-friction source of stress. Between debit orders, subscriptions, and ad-hoc payments, it’s easy to forget one. The goal for Notify was to build a system that required no database, no maintenance, and relied on something most people already use — an Excel spreadsheet.

Architecture & choices

  • Cloudflare Workers — handles scheduled and on-demand reminders.
  • Cloudflare R2 — stores expenses.xlsx securely and privately.
  • SheetJS (xlsx) — parses Excel data inside the Worker.
  • Resend — sends transactional emails when expenses are due.

How Notify works

Missed payments calendar
  1. The Worker fetches and parses expenses.xlsx from R2.
  2. It computes totals for past and next three days, displaying a summary grouped by date.
  3. Any item due tomorrow triggers an email reminder through Resend.

Sample Output

The output below shows how Notify summarizes expenses from the Excel file and what would be sent via email for items due tomorrow.

            📌 Past 3 days:
            📅 Day 1 - Total: R350.00
            • Internet Subscription - R200.00 (Subscription) | Paid: ✅
            • Electricity Bill - R150.00 (Utility) | Paid: ❌

            📌 Next 3 days:
            📅 Day 2 - Total: R400.00
            • Water Bill - R200.00 (Utility) | Paid: ❌
            • Groceries - R200.00 (Shopping) | Paid: ❌

            📧 Email (tomorrow's reminders):
            Reminder: Expenses Due Tomorrow
            • Electricity Bill - R150.00 (Utility) | Paid: ❌
            • Water Bill - R200.00 (Utility) | Paid: ❌
            

Future enhancements

We plan to extend Notify to pull data from Google Sheets, sync automatically to R2, and even send notifications through Slack or WhatsApp. The goal is to make it a truly multi-channel, zero-maintenance expense tracker.

Conclusion: Notify is a reminder that simplicity often beats complexity. A spreadsheet, a Worker, and an email API — that’s all it takes to automate one more part of your daily life.

Authenticated Jobs — Driving Job Opportunities and Traffic to Fund Development
Serverless | Job Platform | Traffic Monetization
November 2025 • Serverless • Cloudflare Workers • R2 • Cron Jobs

TL;DR: Authenticated Jobs collects verified job postings from employers, aggregates them nightly, and publishes them on a user-friendly platform. Users can browse and apply to jobs, generating traffic that supports monetization through Google AdSense and funds further development.

View More

The Problem

Unemployment remains a pressing issue, while job seekers struggle to find up-to-date and verified job listings. Many sites provide outdated or unverified posts, creating frustration. Authenticated Jobs aims to aggregate verified listings and deliver them in a streamlined, actionable format.

Architecture & Choices

  • Cloudflare Workers — runs scheduled jobs nightly to fetch and process new listings.
  • Cloudflare R2 — stores job data securely in JSON or CSV files.
  • Cron Jobs — nightly aggregation at 4:00 AM, combining the latest listings with full job descriptions.
  • Serverless Functions — serve job listings dynamically when users browse.
  • Google AdSense — monetizes the traffic generated from users browsing and applying for jobs.

How Authenticated Jobs Works

  1. Employers submit job listings through an authenticated portal.
  2. Listings are stored in a database temporarily until nightly aggregation.
  3. Every night at 4:00 AM, a scheduled job fetches all new listings and merges them with existing jobs.
  4. The Worker compiles the listings into a readable blog-style page with job title, description, requirements, and application link.
  5. Users browse, filter, and apply directly via links; their interactions generate **organic traffic** that drives AdSense revenue.

Sample Output

This is how a typical job listing appears on the platform:

        Job Title: Frontend Developer
        Company: Tech Solutions Ltd
        Location: Johannesburg, South Africa
        Description: Build and maintain web applications using modern JavaScript frameworks.
        Requirements:
        - 2+ years experience with React or Vue
        - Experience with REST APIs and version control
        - Strong problem-solving skills
        Apply here: https://jobs.yoursite.com/job/12345
        

Sample Implementation

        export default {
        async scheduled(event, env, ctx) {
        console.log("🕒 [CRON] Fetching new jobs:", new Date().toISOString());
        ctx.waitUntil(fetchAndAggregateJobs(env));
        }
        };

        async function fetchAndAggregateJobs(env) {
        const jobsBucket = env.JOBS_BUCKET;
        const newJobs = await fetchNewJobsFromEmployers();
        const existingJobsObject = await jobsBucket.get("jobs.json");
        let existingJobs = existingJobsObject ? JSON.parse(await existingJobsObject.text()) : [];
        const combinedJobs = [...existingJobs, ...newJobs];
        await jobsBucket.put("jobs.json", JSON.stringify(combinedJobs));
        console.log(`✅ Aggregated ${newJobs.length} new jobs, total: ${combinedJobs.length}`);
        return combinedJobs;
        }
        

Future Enhancements

  • Provide analytics for employers and users to track views and applications.
  • Enhance monetization with sponsored job listings alongside AdSense ads.

Conclusion: Authenticated Jobs solves a real-world problem—connecting job seekers with verified opportunities—while driving traffic that can fund further development. Simple, useful, and monetizable.

Job portal interface Cron job aggregation diagram