{"slug": "second-look-a-local-scam-check-for-freelancers-before-you-reply", "title": "Second Look: a local scam check for freelancers, before you reply", "summary": "A developer built Second Look, an open-source, local-first command-line tool that flags common freelance payment scams—such as reverse invoices, pay-to-start fees, overpay-and-refund schemes, and off-platform payment requests—before a freelancer replies. The tool uses eight plain regex rules to determine a verdict and optionally runs a local Gemma model to draft an explanation and suggested reply, with a browser demo and 50 tests covering 20 example messages. The project is MIT-licensed and designed so client messages never leave the user's laptop.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*\n\nNot long ago a \"client\" for my side hustle sent me a payment request. It wasn't money coming to me. It was a PayPal invoice for *me* to pay, presented as a fee I had to cover before the work could start. I didn't pay it, but I did read it twice before I noticed it was backwards. A real client pays you.\n\nThat's the reverse-invoice trap, and it has relatives that every new freelancer, Etsy seller and Marketplace seller sees sooner or later: buy the \"training kit\" first, an overpaid check where you \"just send back the difference\", gift cards for a \"transfer fee\", a \"verification code\" someone needs, \"let's move to WhatsApp so I can pay you directly\".\n\n**Second Look** is a small command-line tool you run before you reply. Paste the message and it gives you:\n\nIt all runs on your laptop. Client messages are full of names, rates, addresses and payment details, so pasting them into a cloud chatbot is a risk of its own.\n\n**Who would pay for it:** new freelancers on Upwork, Fiverr, Contra and Freelancer, and small online sellers. I can see it as a $19 one-time desktop app, or as a \"message check\" perk that a paid freelancer community gives its members.\n\n**Try it in your browser: [https://maddiebrooks208.github.io/second-look/](https://maddiebrooks208.github.io/second-look/)**\n\nPaste a message or click one of the 20 samples. The demo page runs a JavaScript port of the rules, so nothing you paste leaves the browser. A check script confirms it gives the same verdict, rules and matched words as the Python version on all 20 examples. The Gemma explanation runs locally, so it's only in the command-line app.\n\nCommand-line app with Gemma, real output from the repo (8-CPU Linux box, no GPU). Screenshots and an asciinema recording are in [`/demo`](https://github.com/maddiebrooks208/second-look/tree/main/demo).\n\n``` bash\n$ second-look check examples/09-whatsapp-direct.txt\nSECOND LOOK: BE CAREFUL\n  [medium] Move off the platform before escrow\n      matched: 'WhatsApp', 'pay you directly'\n\nWhy:\n  Verdict: Be careful. The client is attempting to bypass the platform's payment\n  protection by communicating through a different channel.\n\nSuggested reply:\n  Thanks for the message. Before I start, I'd like to keep our chat and the contract on\n  the platform with a funded milestone. Happy to go from there.\n\n(gemma-3-1b-it-Q4_K_M.gguf: explanation=model, reply=fallback; guard tripped: moves the chat off-platform: 'WhatsApp'. The verdict comes from plain rules, not the model.)\n```\n\nThe explanation came from Gemma. Gemma's reply draft was rejected, and the last line says why. A normal job looks like this:\n\n``` bash\n$ second-look check examples/12-legit-candles.txt\nSECOND LOOK: LOOKS OK\n  no known payment-trap patterns found\n\nWhy:\n  Verdict: Looks OK. The client is requesting a significant amount of content creation,\n  and none of the known trap patterns indicated a potential risk.\n\nSuggested reply:\n  Okay, I can certainly handle that. Let's see what I can do.\n```\n\nA local-first \"before you reply\" checker for freelancers and side hustlers.\n\nPaste a client message, job post, or payment email. Second Look flags the classic side-hustle payment traps (an invoice sent *to you*, \"pay for the training kit first\", overpay-and-refund, gift cards or crypto, requests for logins or codes, moving off-platform before escrow, pressure to hurry, big unpaid \"test tasks\") and suggests a calm reply that keeps money on the platform. Nothing leaves your laptop.\n\n`second_look/rules.py` or run `second-look rules`.\nMIT-licensed. The core has no dependencies; `llama-cpp-python` is optional. There are 50 tests, including one for each of the 20 example messages.\n\n**The rules decide the verdict.** Eight plain regex rules (reverse invoice, pay to start, overpay and refund, gift cards or crypto, asks for logins or codes, off-platform, pressure, large unpaid test task) each carry a severity and a one-line \"why\". Any high-severity hit means Stop. A medium hit means Be careful. Anyone can read the list and add to it. I think a list of scam patterns should be public.\n\n**The model only does the wording.** [Gemma 3 1B instruction-tuned](https://ai.google.dev/gemma) runs as a 4-bit GGUF (806 MB) through [llama.cpp](https://github.com/ggml-org/llama.cpp) and llama-cpp-python, on CPU. It gets the fixed verdict, the findings and the message, and makes two short calls, one for the explanation and one for the reply. Each check takes about 4 to 5 seconds.\n\n**Then I watched it fail, and kept the logs.** All four runs over the 20 examples are in [`/logs`](https://github.com/maddiebrooks208/second-look/tree/main/logs), unedited:\n\nThe final run kept **16 of 20 Gemma explanations** and **5 of 20 Gemma replies**. All five kept replies were for the normal messages. Every reply Gemma drafted for a flagged message was rejected. I could have hidden that, but it's the most useful thing I learned: a 1B model is good at saying *why* something looks wrong, and it should not be the one writing your answer to a scammer. For those messages, Second Look now uses a fixed, boring and safe reply.\n\n**Best Use of Gemma:** Gemma 3 1B IT runs locally through llama.cpp, writes every explanation and the replies to normal messages, and its failures shaped the guard design.\n\n*AI disclosure: I built this with AI coding assistance (Grok Bot), and this post was drafted with AI help and edited by me. Every output shown is from a real run, and the logs are in the repo. Credits: Gemma 3 (Google, Gemma Terms of Use), llama.cpp, llama-cpp-python, asciinema, Pillow.*", "url": "https://wpnews.pro/news/second-look-a-local-scam-check-for-freelancers-before-you-reply", "canonical_source": "https://dev.to/maddiebrooks_dev/second-look-a-local-scam-check-for-freelancers-before-you-reply-1g0g", "published_at": "2026-10-16 13:01:59+00:00", "updated_at": "2026-10-16 13:15:37.313617+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "large-language-models", "ai-products"], "entities": ["Second Look", "Gemma", "Upwork", "Fiverr", "Contra", "Freelancer", "PayPal", "GitHub"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/second-look-a-local-scam-check-for-freelancers-before-you-reply", "markdown": "https://wpnews.pro/news/second-look-a-local-scam-check-for-freelancers-before-you-reply.md", "text": "https://wpnews.pro/news/second-look-a-local-scam-check-for-freelancers-before-you-reply.txt", "jsonld": "https://wpnews.pro/news/second-look-a-local-scam-check-for-freelancers-before-you-reply.jsonld"}}