home.social

Search

531 results for “keep_surfing”

  1. Epstein Files
    I filed another FOIA

    DOJ says they have released all the Epstein files except for ones that are duplicative, exempt from disclosure or protected by privilege. OK, let’s test that assertion with a FOIA request.

    Here is the list of non-testifying witnesses from Ghislaine Maxwell’s criminal trial.
    justice.gov/epstein/files/Data 0095751.pdf

    Starting on the second page each blue line is a different person. Under each blue line are documents for that person. A number of those documents are FD-302 interviews. These are documents prepared by the FBI after interviewing someone.

    It is *easy* for anyone to determine if a document has been released. Simply search DOJ’s Epstein website on the 3-part document identifier in the first column of the Maxwell list. I did that. For each FD-302 on the Maxwell list I searched DOJ’s website. By doing that I determined which people were victims or likely victims and which FD-302s have been released.

    Keep in mind that only about 100 of the 1,000+ victims were involved in any way in Maxwell’s trial.

    Now about that FOIA...

    My recent FOIA request listed the 3-part document identifiers from the Maxwell list that were FD-302s for victims or likely victims and which I have not been able to find on DOJ’s website. I specifically asked for copies that **include the EFTA number** stamped in the lower right corner of each page.

    If those FD-302 victim interviews have actually been released as claimed by DOJ, then it would be a simple matter for DOJ to produce copies in response to my FOIA, right? On the other hand, if those 302s have not been released then the FOIA statutes require DOJ to tell me there are no responsive documents - which would be an admission that they never released the 302s listed in my FOIA.

    In reply to my FOIA I received the exact same goofy letter that I have received several times in reply to earlier FOIAs. Here is one of those earlier letters that I put on Google drive:
    drive.google.com/uc?export=dow

    Bottomline: DOJ refuses to provide any proof that these FD-302 victim interviews have been released and also refuses to admit that they have not been released. That is not a defensible position.

    For anyone interested in my analysis of the Maxwell list of non-testifying witnesses it is a PDF on Google drive.
    drive.google.com/uc?export=dow

    But wait, there’s more...

    I also filed a different FOIA that is also based on the Maxwell list of non-testifying witnesses. This time DOJ replied and basically asked for clarification which I provided. Now I am waiting for DOJ to reply again.

    If you look at my report (see link above) then you will see multiple examples of where DOJ released some FD-302 interviews but not all interviews for the **same victim**. Obviously DOJ was using some criteria to decide which interviews to release and which interviews to not release. This FOIA asked for a copy of those criteria. I will report back when I get a reply.

    BTW, victim 045 in the Maxwell list was interviewed four times. Initially DOJ only released the first FD-302 interview report. That report does not mention Trump. Later, after widespread coverage in the media, DOJ released the other three FD-302 interviews for this same victim. Each of those interviews includes the word Trump.

    Sure would like to see the criteria DOJ used to hide many FD-302 victim interviews from the public. Stay tuned...
    #Epstein #ReleaseTheEpsteinFiles

  2. 25th October 2026

    Hello,

    I started this blog 22 years ago now (I don’t recommend going back to the start), and for the last 5 years I wrote a monthly “status update” post, aiming to mainly write about interesting stuff I might have done in the world of open source software, which I hoped in turn would motivate me to do more interesting stuff in open source software.

    The world changed a lot in that time. If I started now this would probably be a podcast with 16 listeners, instead of being a WordPress blog with 16 subscribers.

    I’ve spent a lot of time this year reading and thinking about the impact of large language models on the tech industry and open source. Its interesting because this feels like the moment, whether we like it or not, hacker culture goes mainstream. This week the world’s major news outlets had to figure out what PHP is.

    That the BBC’s cyber correspondent didn’t know PHP existed has caused some joking and debate online.

    24 years ago I was figuring out what PHP is. Jonathan Atkinson, who I met in a forum that was nominally about writing video games in QBASIC, asked me to make a wiki in PHP. So I did.

    All I knew about wikis was that, it’s like a regular website except anyone can edit it. I named the project: Wiki! Here’s a quote from the README:

     How do I install it?  It's best run in its own directory. Create it one. You'll also want a directory for nodes,  or you could keep them in the base wiki dir. Either way, the nodes directory has to be  chmod'ed to 777. 

    You might raise your eyebrows at that comment if you aren’t yourself a teenage hacker discovering web development.

    Wiki! did have a login system, and the passwords were even stored as MD5 hashes rather than plain text, as I heard that was good practice. In hindsight, an attacker who knew how to set the HTTP Cookie header could impersonate anyone, like this: Cookie: wikiticket=admin.

    Here is a snippet of the file edit.php. Note that $node and $title are inputs you can set via a POST request, or even via URL parameters like edit.php?title="/etc/passwd":

     $t=$title;  if ($node) {   	// Write new data  	//  	$file=fopen($nodedir.$t.".wiki", "w+");  	$node=stripslashes(ereg_replace("(\r\n|\n|\r)","<br>", $node));	// Linebreak to <br>  	fputs($file, $node."\n"); 

    Even if you just learned what PHP is today, you might see that this is not an entirely secure design.

    Anyway, at the time I was proud of my work, and I needed somewhere to host it. So, as you would in 2002, I registered the name “wiki” on sourceforge.net and uploaded the project code.

    Sourceforge, for those who haven’t yet reached middle age, was the 2000’s equivalent of Github. It allowed projects to have their own website, as long as they included the Sourceforge logo somewhere, and the website could use PHP. Perfect, I thought, the project’s website will be a wiki!

    Looking back now through archive.org, I can see this code actually ran in public for many years.

    Here it is around launch day in 2002: https://web.archive.org/web/20021012080349/http://wiki.sourceforge.net/wiki

    I have a local copy from around this time, which includes indexjon.wiki:

    
    Sam, there are some serious bugs in this wiki. I keep on getting 'document contains no data' errors; get me on AIM.
    
    Welcome to grove.swoo.net. You may or may not be interested in the [weblog].
    JonathanA - 29/8/02 - 11:36 am
    JonathanA - 29/8/02 - 07:36 am

    Those bugs went unfixed forever, and six months later, the front page text had been replaced with two poems, one in Italian and one in Russian: https://web.archive.org/web/20030420205758/http://wiki.sourceforge.net

    One is “Non chiederci la parola che squadri da ogni lato” by Eugenio Montale, written in 1923, and presumably posted by a fan. Does anyone know what it’s about? A machine translation suggests it might discuss “the crisis of certainty faced by contemporary man”. The other is “Anecdote for Fathers” by William Wordsworth, in Russian via an unnamed translator.

    Let’s just sit with that for a moment. Imagine what happens in 2026 if a trivially exploitable PHP website hosted by a US corporation goes online: it’ll be mining bitcoin, serving pornography and drowning in racist and antisemitic spam, probably all within the same day.

    In 2003, over the course of six months, my naive implementation of a wiki was gifted with… two rather thoughtful poems.

    Fast forward another year. I was about to turn 18 years old, was studying for A levels and mostly concerned with hanging out in the park drinking cheap cider and learning to play the guitar. I was certainly not thinking about this rather flawed chunk of PHP code that I’d written two years earlier, but via the magic of archive.org we can see that various people were genuinely trying to use it as a wiki: https://web.archive.org/web/20041121113508/http://wiki.sourceforge.net

    In hindsight, perhaps it attracted so much attention because I’d literally taken the subdomain: http://wiki.sourceforge.net/, unintentionally boosting the SEO reach quite a bit. The site was still active right up until 2007.

    I can’t find it now, but I do remember receiving an email at some point from sourceforge.net noting that they’d taken down the wiki! website after discovering it was a major security risk. And at some point they must have (quite reasonably) reclaimed the project name as well, since http://sourceforge.net/projects/wiki no longer exists. It will always live on in my heart, though, and for the moment at: https://web.archive.org/web/20021014172056/http://sourceforge.net/projects/wiki/

    The world has changed significantly since I was a teenage hacker. Some of what I learned in those days is completely obsolete, such as the QBASIC programming language and VGA graphics. I am a world expert in these irrelevant topics.

    Other stuff that I picked up in the early 2000s has become the foundation of my career as an operating systems developer: C programming, Linux distributions and an gradual induction into open source desktop world via Planet GNOME. And good old PHP, of course. Who knew that, a quarter way through the 21st century, PHP would be front page news?

    Age 18, I didn’t tell anyone in the real world that I’d written a wiki because it’d be the first time they’d heard the word “wiki”. The word evoked exotic and mysterious feelings of Hawaii in 2002. Now it universally evokes Wikipedia. People are learning about password hygiene and PHP. The arrival of AI on the scene, to me, fits into this bigger picture that began in the last century: we, the Computer People, are becoming Mainstream.

    #ai #openSource
  3. I used to treat ChatGPT like a vending machine. Need a React hook? Drop a coin. Need a PR summary? Drop another. Every ask started from zero — stack, conventions, what “done” meant — and every reply drifted a little from how we actually ship.

    The waste wasn’t the tokens. It was re-explaining our frontend rules every single time, then cleaning up the same mistakes.

    So I stopped pasting one-offs and started treating prompts like code: named, versioned, and checked into the repo.

    One-off asks don’t compound


    A throwaway chat is fine for a throwaway question. Frontend work rarely is throwaway:

    • “Write a Modal” without our focus-trap / Escape / return-focus rules
    • “Add loading states” without our skeleton vs spinner convention
    • “Review this PR” without what AI should skip vs what a human owns
    • “Refactor this form” without our form library and error-message pattern

    You get something that compiles. You don’t get something that matches the last three PRs. The next person (or the next you) pays the tax again.

    What belongs in a prompt library


    I keep a small folder — prompts/frontend/ — not a novel. Each file is one job, one outcome shape.

    Mine look like this:

    prompts/frontend/
    pr-review-ai.md # what the model checks vs leaves for humans
    new-component.md # scaffold + a11y buckets + token rules
    design-token-change.md # changelog / RFC checklist before merge
    test-plan.md # real coverage vs fake green
    agent-ui-diff.md # component boundaries, no random token edits
    accessible-react.md # roles / keyboard / contrast report required

    If a prompt isn’t reused at least twice a month, it doesn’t earn a file. Sticky notes in chat stay sticky notes.

    The shape every prompt gets


    Same skeleton so humans and agents know where to look:

    # <job name>

    ## When to use
    One sentence. If it doesn’t match, don’t force it.

    ## Context to paste
    - Framework / router / form lib (or “read from repo”)
    - Design tokens source of truth
    - Related golden files (paths)

    ## Hard rules
    Bullet list the model must not violate.
    Prefer native HTML, keep tokens, no drive-by refactors, etc.

    ## Output format
    Numbered sections the reply must include.
    Missing a section = reject the turn.

    ## Done looks like
    Concrete acceptance — not “looks good.”

    The “output format” line is the whole game. Models fill schemas. They invent vibes when you don’t give one.

    From ChatGPT paste to agent / editor default


    Once the files exist, wire them where work actually happens:

    1. Cursor / Copilot / Claude project instructions — point at prompts/frontend/ or inline the two you use daily.
    2. PR bot / agent — load pr-review-ai.md as the system brief; humans still own product judgment.
    3. Slash or snippet — @new-component expands the scaffold prompt so nobody retypes it.
    4. CI-ish habit — if the agent reply skips a required section, treat it like a failed check and re-run with the same file.

    You don’t need a fancy prompt CMS. Markdown in git is enough. Review prompt changes in PRs the same way you’d review eslint config.

    A tiny migration story


    Week 1 I had twelve ChatGPT threads titled “modal again.” Week 3 I had six files and deleted half the threads.

    What changed in practice:

    • New Button / Modal / Combobox asks started from the same a11y report shape
    • Token edits stopped sneaking hex literals into components
    • AI PR comments stopped arguing about naming when the prompt said “leave naming to humans”

    Same models. Less re-prompting. The library held the team memory the chat UI kept forgetting.

    What not to put in the library


    • Product pitches and marketing copy (keep prompts about shipping UI)
    • One-shot debug sessions that will never recur
    • Entire style guides pasted twice — link the real doc instead
    • Secrets, private URLs, or customer data as “examples”

    A prompt library is DX infrastructure. If it reads like a blog draft, move it to the blog.

    Start with three, not thirty


    Tonight, pick the three asks you keep repeating. Write each as one markdown file with When / Rules / Output / Done. Drop them in the repo. Point your editor agent at that folder.

    Next time you open a blank ChatGPT box for a frontend task, open the matching file instead. Paste once. Reuse forever. That’s the whole upgrade — from one-off asks to a library your future self (and your agents) can actually find.#frontend #ai #dx #productivity #software #coding #development #engineering #inclusive #community
    From One-Off ChatGPT Asks to a Reusable Frontend Prompt Library

  4. In September 2026, a founder posted on r/SaaS that Google was not ranking their new site even though they had done the "basic SEO" work: meta titles, descriptions, indexing. Search Console showed 159 impressions and 1 click in 28 days, with an average position of 48. One of the most useful replies pointed out that people only search an app's name once they already know it; the real demand sits one step earlier, in someone describing the job they want done.

    That is the core problem with keyword research for a first SaaS. If you built your app with Cursor, Claude Code, Lovable, Bolt, Replit or v0, you probably wrote pages about your product, in your words. Customers type their problem, in their words. This guide shows you how to find those words with free tools, check which ones a brand-new site can win, and turn them into a short list of pages to write.

    Quick glossary


    • Keyword (or query): the exact words someone types into Google, like "how to send invoice reminders".
    • Search intent: what the person actually wants. To learn something, compare options, buy something, or go to a specific site.
    • Search volume: roughly how many times per month people search a keyword. Every tool estimates this differently.
    • Keyword difficulty (KD): a score from a tool that guesses how hard it is to reach page one. It is a guess, not a rule.
    • Long-tail keyword: a longer, more specific search with fewer searches, like "late payment reminder email template for freelancers". Easier for new sites.
    • SERP: search engine results page. The page Google shows after you search.
    • Impressions: how many times your site appeared in Google results, even if nobody clicked. You see this in Google Search Console.


    Step 1: Write down your customers' problems in their words


    Do not open a keyword tool yet. Start a text file of phrases real people use to describe the problem your app solves. Look in:

    • Your support emails, chat messages and signup survey answers.
    • Reddit threads where your users hang out. Search for the problem, not your product category.
    • Posts and replies on X complaining about the problem.
    • 1-star to 3-star reviews of bigger competitors. Complaints are full of search phrases.

    Copy phrases exactly. This guide uses a hypothetical example, an invoice tool for freelancers, whose notes might contain "client keeps paying late", "how do I remind a client to pay without sounding rude" and "invoice template that adds tax automatically".

    An AI assistant can pull phrases out of messy notes. Just do not let it invent data:

    Below are raw notes from support emails, Reddit threads and reviews about
    [PROBLEM YOUR APP SOLVES]. My customers are [WHO THEY ARE].

    1. Extract every distinct phrase a customer used to describe their problem
    or goal. Keep their original wording.
    2. Add 10 more phrases a beginner in this audience might type into Google,
    and mark these clearly as "AI guess".
    3. Do NOT include search volumes, difficulty scores or any numbers.
    I will check demand myself with real tools.

    Notes:
    [PASTE NOTES HERE]

    Aim for 20 to 40 phrases. These are your seed keywords.

    Step 2: Expand your seeds with free tools


    Now check what people actually type. All of these are free as of October 2026:

    • Google autocomplete: type a seed into Google slowly and note the suggestions. Google's help page says predictions reflect real searches, but they also depend on your language, location and past searches. Use a private window.
    • People Also Ask and related searches: the question box on the results page and the related searches near the bottom. Each question is a possible section or page.
    • Google Trends: compare two or three phrases to see which is more popular and whether interest is growing. Google says Trends shows relative interest scaled from 0 to 100, not search counts, and very low-volume terms show as 0. So "0" does not always mean nobody searches it.
    • Google Keyword Planner: free inside a Google Ads account. Google's help says you must enter billing information to use "Discover new keywords", but you do not need to run a campaign. Expect volume ranges like "100-1K" instead of exact numbers if you are not spending; Google introduced this limited view for lower-spend accounts, and Google Ads community experts still describe it the same way. Ranges are fine for comparing ideas.
    • Bing Webmaster Tools Keyword Research: free with a Bing Webmaster Tools account. Enter a root keyword and get related keywords, question keywords and the top ranking URLs, filtered by country, language and device for any period in the last six months. The numbers are Bing data, so use them to compare phrases, not to predict Google traffic.
    • Ahrefs Free Keyword Generator: free, no account. Enter a seed and get keyword ideas, including questions, with estimated volumes.
    • Semrush free account: 10 keyword research queries per day, no credit card, per Semrush's own free-account page. Enough to check a shortlist.

    Add everything relevant. In the hypothetical invoice example, you might add "how to politely ask for payment" and "what to do when a client doesn't pay". A list of 50 to 150 phrases is normal; the next steps cut it down.

    Step 3: Check search intent by looking at the results page


    A keyword tool cannot tell you what Google thinks the searcher wants. The results page can. For each promising phrase, search it in a private window and look at the top 10 results:

    • Mostly blog posts and guides? The intent is learn. You need a helpful article.
    • Mostly "best X tools" lists? The intent is compare. You need a list or comparison page.
    • Mostly product homepages and pricing pages? The intent is buy. Your landing or feature page fits.
    • Mostly templates, calculators or generators? People want a tool or template, not an essay.

    Write the intent next to each keyword. If Google shows templates and you planned a long essay, the essay will struggle to rank.

    Step 4: Judge whether a new site can compete


    Most beginners skip this. A brand-new domain has no history and few links, so it cannot beat huge sites on broad terms. On the same results page, look for these signals.

    Good signs (opportunity):

    • Reddit, Quora or forum threads in the top 10. Google could not find a great dedicated page.
    • Small blogs, personal sites or tiny tools ranking.
    • Results that only half answer the query or are outdated.

    Bad signs (skip for now):

    • Every result is a big brand, a huge publisher or a well-known tool.
    • The top results are recent, excellent guides that answer everything.

    Treat keyword difficulty as a hint; the SERP is the real test. Mark each keyword "go", "maybe" or "skip".

    Step 5: Pick long-tail problem keywords and map one main keyword per page


    Now pick your first 5 to 10 pages. Choose keywords that are:

    1. Marked "go" in Step 4.
    2. Close to your product. Someone searching it has the problem you solve.
    3. Specific. Long-tail problem phrases beat broad category words for a new site.

    For the hypothetical invoice tool, "invoicing software" is a skip (big brands everywhere), while "payment reminder email template for freelancers" could be a go if forums and small blogs rank.

    Give each page one main keyword and a few close variations. If two keywords show almost the same top 10 results, they belong on the same page. If the results are different, they need separate pages.

    AI can draft this grouping if you give it your real data:

    Here is my keyword list with the intent and the "go/maybe/skip" verdict I
    noted from looking at Google's results myself:
    [PASTE ROWS: keyword | intent | verdict | volume range if I have one]

    Group these into page ideas:
    - One main keyword per page, plus up to 5 close variations.
    - Put keywords together only if they share the same intent.
    - Suggest a page type (guide, template, comparison, landing page).
    - Ignore anything marked "skip".
    - Do NOT invent or estimate search volumes or difficulty. Use only the
    numbers I gave you; leave blanks blank.
    Output a table: page idea | main keyword | variations | page type | why.

    Check its work against the real results pages, then keep everything in one sheet:

    keyword,source,intent,verdict,volume_range,main_or_variation,target_page,status,date_published,gsc_impressions_28d,gsc_avg_position
    payment reminder email template for freelancers,autocomplete,learn/template,go,(from your tool),main,/templates/payment-reminder-email,draft,,,
    how to politely ask a client for payment,people also ask,learn,go,(from your tool),variation,/templates/payment-reminder-email,draft,,,
    invoicing software,keyword planner,buy,skip,(from your tool),,,,,,

    The rows above are hypothetical. Fill in volume ranges from Keyword Planner, Bing or another tool, and leave the Search Console columns empty until Step 7.

    Step 6: Write each page to answer the query


    You are not writing "SEO content". You are writing the best answer to one question. A simple checklist for each page:

    PAGE CHECKLIST
    [ ] Main keyword (or a natural version of it) in the title and the H1
    [ ] First 2-3 sentences answer the question directly
    [ ] Format matches what Google shows (template, steps, list, tool)
    [ ] Covers the People Also Ask questions for this keyword
    [ ] Includes something real: a screenshot, an example, your own steps
    [ ] Clear, specific meta description written for humans
    [ ] Links to 1-2 related pages on your site, and from your homepage or blog
    [ ] Soft, relevant mention of your product where it actually helps
    [ ] Page is indexable (not blocked, not noindex) and in your sitemap

    If AI drafts the page, give it your notes, real examples and the questions you collected, then edit hard. A page that sounds like every other AI article adds nothing new.

    For the hypothetical invoice tool, the reminder page would open with a ready-to-copy template, add first, second and final reminder versions, and only then mention the app can send them automatically.

    Step 7: Measure in Google Search Console and iterate


    Wait a few weeks after publishing; new pages take time to be crawled. Then open Google Search Console, go to Performance, and use:

    • Queries tab: the actual searches where your site appeared. Google's help explains you can switch metrics on for clicks, impressions, CTR and average position.
    • Pages tab: click a page, then open Queries to see which searches it shows up for.
    • Date range: the default is the last three months. Compare the last 28 days with the previous period.

    What to look for:

    • Queries with impressions but position 8 to 20: improve that page. Add the missing section, make the answer clearer, link to it from other pages.
    • Queries you never planned for: these are new keyword ideas from real data. Add them to your sheet.
    • A page with zero impressions after several weeks: check it is indexed, then check the intent again in Step 3.

    Update the sheet once a month and pick your next batch of pages from what you learn.

    Common mistakes


    • Starting with your product category. Broad category words are owned by big brands. Start with problem phrases.
    • Trusting one volume number. Every tool estimates differently, and Keyword Planner often shows only ranges. Use numbers to compare, not to predict traffic.
    • Skipping the results page. Intent and competition are visible in the SERP, not in a spreadsheet.
    • Letting AI invent volumes. If an AI gives you exact search numbers without a data source, they are made up.
    • One keyword per blog post, ten posts on the same topic. Similar keywords with the same results belong on one strong page.
    • Giving up after two weeks. New sites need time.


    Your action summary


    1. Collect 20 to 40 customer phrases from support emails, Reddit, X and competitor reviews.
    2. Expand them with autocomplete, People Also Ask, Trends, Keyword Planner, Bing and one free keyword generator.
    3. Search every promising phrase and write down the intent.
    4. Mark each keyword "go", "maybe" or "skip" based on who ranks.
    5. Pick 5 to 10 long-tail problem keywords and give each page one main keyword.
    6. Write each page to answer the query in the format Google already shows.
    7. Check Search Console Performance after a few weeks and plan the next batch.

    You do not need an expensive SEO tool to find your first keywords. You need your customers' words, an honest look at the results page and one small spreadsheet, so pick five problem phrases today and write the page that answers the first one this week.#seo #saas #beginners #marketing #software #coding #development #engineering #inclusive #community
    How to Find Keywords Your New SaaS Can Actually Rank For: A 7-Step Free Keyword Research Guide for Beginners

  5. 🍝 The Flying Spaghetti Monster, come to my assistance.
😋 My Lord, make haste to help me.

    Glory be to the Meatball 🧆, to the Sauce 🥫, and to the Holy Noodle 🍝.
    As it was in the beginning, is now, and ever shall be. 🍜

    🍝 The Flying Spaghetti Monster made an everlasting covenant with Quob People, and Quob never ceases to bless them. Grateful for Quob Noodly Appendage, we confidently direct our prayer to Quob.
    😋 My Lord, the Flying Spaghetti Monster, bless Quob people.

    "2. As evening falls, help me set down today’s busyness and gladly enjoy the rest and pleasure You intend (The Loose Canon, The Book of Piraticus, Chapter 9, Verse #3; “And he shall keep it holy not by praising me, but enjoying himself.”)"

    My Lord, the Flying Spaghetti Monster,
give our bodies restful sleep,
and let the work we have done today bear fruit in eternal life.
    R’Amen 🍜

    2026-10-25T17:41:52+09:00

    #날아다니는스파게티괴물님 #성면 #면발 #스파게티 #라멘 #파스타파리안 #성무일도 #성무일과 #매일전례
    #FlyingSpaghettiMonster #FSM #HolyNoodle #Noodle #Spaghetti #Ramen #Pastafarian #NoodlyAppendage #Pastafarian #FSMism #FSMist #DivineOffice #DailyOffice #Breviary

  6. I spent a long time thinking follow-ups were rude. Sending a second email to someone who hadn't replied felt like nagging — like I was the person who double-texts and then wonders why nobody answers.

    Then I started running outreach for a one-person content operation, and I learned the opposite: most non-replies aren't rejections. They're just lost in someone else's inbox.

    The inbox is not a verdict


    Editors, site owners, and collaborators get dozens of pitches a week. Mine was landing somewhere between a newsletter, a PR blast, and an invoice reminder. If it didn't get opened in the first day, it sank — not because it was bad, but because inboxes don't resurface things on their own.

    Once I accepted that, follow-ups stopped feeling like pressure and started feeling like a second chance for the first email to be seen at all.

    One follow-up, then I move on


    My rule now is simple: one polite follow-up, about a week later, and then I drop it and move on.

    The follow-up is short — shorter than the original pitch. It restates the idea in one line, adds nothing new to argue about, and ends with an easy out: "No worries at all if it's not a fit." That last line matters more than it looks. It gives the other person permission to say no quickly, which is the only kind of no that doesn't linger.

    What I don't do: a second follow-up, a "just bumping this to the top of your inbox" third email, or a follow-up that pretends the first one never happened. One is professional. Two starts to feel like a funnel.

    Rejection is data, silence usually isn't


    The replies I actually learned from were the no's. A short "not right for us right now" told me more about fit than a month of silence ever did. Silence, on the other hand, taught me almost nothing — the same pitch that got no reply from one editor got an enthusiastic yes from another.

    So I stopped rewriting pitches based on silence. If an idea gets no reply twice, from two different people, that's a signal about the idea. If it gets no reply once, that's a signal about timing, workload, or a Tuesday afternoon inbox. Those are very different problems, and only one of them is worth fixing.

    The spreadsheet that made it bearable


    The unglamorous part: I track every outreach in one sheet — who, when, what I pitched, and whether I followed up. Without it, I either forgot to follow up entirely or, worse, followed up with someone I'd already pitched twice.

    The sheet also quietly changed my attitude. When you can see forty pitches and twelve replies in one place, a single silence stops feeling personal. It's just a row in a table. That distance is what lets a solo operator keep pitching without burning out on it.

    What I'd tell another solo operator


    Follow up once, politely, and then let it go. Treat silence as inbox physics, not judgement. And keep a record, because your memory will either catastrophise the silence or forget the follow-up — and both cost you more than the email itself.

    If you run outreach solo, I'm curious: what's your follow-up rule? One and done, or do you have a number that works for you?#career #writing #productivity #discuss #software #coding #development #engineering #inclusive #community
    What Running a One-Person Outreach Operation Taught Me About Follow-Ups

  7. Building an e-commerce application with React involves much more than displaying products and adding a shopping cart. A production-ready storefront needs predictable state management, responsive product listings, reliable cart calculations, accessible interfaces, and a checkout flow that customers can trust.

    In my experience, the biggest challenge is keeping the shopping experience consistent as users browse products, change quantities, apply discounts, and move toward checkout. React makes this easier by breaking the interface into reusable components and allowing the UI to respond automatically to changes in application state.

    In this guide, we will build a small e-commerce storefront using modern JavaScript and React-inspired component architecture. We will explore product data, cart operations, inventory validation, discount calculations, and order summaries while keeping the example simple enough to run directly in Node.js.

    Designing a Maintainable React E-commerce Application


    A maintainable e-commerce application starts with clear separation of responsibilities. Product data should remain independent of UI components, cart operations should follow predictable rules, and pricing calculations should live in reusable functions rather than being duplicated across screens. This structure makes features easier to test and reduces the risk of inconsistent totals.

    React components work particularly well for product cards, product grids, cart items, quantity controls, and checkout summaries. Each component receives the data it needs through props, while shared cart state can be managed with useState, useReducer, or a dedicated state management library as the application grows. For a larger storefront, Context or Redux Toolkit can help coordinate state across routes without passing props through every intermediate component.

    The following runnable JavaScript example implements the core business logic behind a storefront. It uses an in-memory product catalog, validates inventory, supports adding and removing products, calculates discounts and shipping, and generates a final order summary. The example runs in Node.js without external dependencies; its functions can later be connected to React components and backend APIs.

    One important production consideration is that the browser must never be the authority for prices, inventory, or payments. A real checkout should send product identifiers and quantities to a trusted backend, which retrieves current prices, validates stock, recalculates totals, and creates a payment session through a payment provider. The frontend should display the resulting server-confirmed order state rather than treating client-side calculations as proof of payment.

    /*
    * Minimal e-commerce business logic.
    * Run with: node ecommerce.js
    * This example uses in-memory data and no external packages.
    */

    console.log("STEP 1: Initialize the product catalog");

    const products = [
    { id: "p101", name: "Wireless Headphones", price: 2499, stock: 8 },
    { id: "p102", name: "Mechanical Keyboard", price: 3999, stock: 5 },
    { id: "p103", name: "USB-C Hub", price: 1499, stock: 12 }
    ];

    // Keep cart entries small: product ID and selected quantity.
    const cart = new Map();

    function findProduct(productId) {
    return products.find((product) => product.id === productId);
    }

    console.log("Available products:");
    products.forEach((product) => {
    console.log(`- ${product.name}: ₹${product.price}`);
    });

    console.log("\nSTEP 2: Add products to the cart");

    function addToCart(productId, quantity = 1) {
    const product = findProduct(productId);

    if (!product) {
    throw new Error(`Product ${productId} does not exist.`);
    }

    if (!Number.isInteger(quantity) || quantity < 1) {
    throw new Error("Quantity must be a positive integer.");
    }

    const currentQuantity = cart.get(productId) || 0;
    const requestedQuantity = currentQuantity + quantity;

    // Validate the requested quantity against available stock.
    if (requestedQuantity > product.stock) {
    throw new Error(`Only ${product.stock} units of ${product.name} are available.`);
    }

    cart.set(productId, requestedQuantity);
    console.log(`Added ${quantity} x ${product.name} to the cart.`);
    }

    addToCart("p101", 2);
    addToCart("p103", 1);

    console.log("\nSTEP 3: Update a cart quantity");

    function updateQuantity(productId, quantity) {
    if (!cart.has(productId)) {
    throw new Error("This product is not in the cart.");
    }

    if (!Number.isInteger(quantity) || quantity < 0) {
    throw new Error("Quantity must be a non-negative integer.");
    }

    const product = findProduct(productId);

    if (quantity > product.stock) {
    throw new Error("Requested quantity exceeds available inventory.");
    }

    // A quantity of zero removes the product entirely.
    if (quantity === 0) {
    cart.delete(productId);
    console.log(`Removed ${product.name} from the cart.`);
    return;
    }

    cart.set(productId, quantity);
    console.log(`Updated ${product.name} quantity to ${quantity}.`);
    }

    updateQuantity("p103", 2);

    console.log("\nSTEP 4: Calculate the subtotal");

    function calculateSubtotal() {
    let subtotal = 0;

    for (const [productId, quantity] of cart.entries()) {
    const product = findProduct(productId);
    subtotal += product.price * quantity;
    }

    return subtotal;
    }

    const subtotal = calculateSubtotal();
    console.log(`Cart subtotal: ₹${subtotal.toFixed(2)}`);

    console.log("\nSTEP 5: Apply a discount code");

    function calculateDiscount(subtotal, code) {
    const discountCodes = {
    SAVE10: { percentage: 10, minimumSpend: 1000 },
    SAVE20: { percentage: 20, minimumSpend: 5000 }
    };

    const discount = discountCodes[code];

    if (!discount || subtotal < discount.minimumSpend) {
    console.log("No discount applied.");
    return 0;
    }

    // Round currency to two decimal places.
    const amount = subtotal * discount.percentage / 100;
    console.log(`${code} applied: ${discount.percentage}% off.`);
    return Math.round(amount * 100) / 100;
    }

    const discount = calculateDiscount(subtotal, "SAVE10");
    console.log(`Discount: ₹${discount.toFixed(2)}`);

    console.log("\nSTEP 6: Calculate shipping and the final total");

    function calculateShipping(subtotalAfterDiscount) {
    // Example business rule: free shipping on orders of ₹3,000 or more.
    return subtotalAfterDiscount >= 3000 ? 0 : 99;
    }

    const taxableAmount = Math.max(0, subtotal - discount);
    const shipping = calculateShipping(taxableAmount);
    const total = taxableAmount + shipping;

    console.log(`Amount after discount: ₹${taxableAmount.toFixed(2)}`);
    console.log(`Shipping: ₹${shipping.toFixed(2)}`);
    console.log(`Order total: ₹${total.toFixed(2)}`);

    console.log("\nSTEP 7: Generate an order summary");

    function createOrderSummary() {
    const items = Array.from(cart.entries()).map(([productId, quantity]) => {
    const product = findProduct(productId);

    return {
    productId,
    name: product.name,
    quantity,
    unitPrice: product.price,
    lineTotal: product.price * quantity
    };
    });

    return {
    items,
    subtotal,
    discount,
    shipping,
    total,
    currency: "INR"
    };
    }

    const order = createOrderSummary();
    console.log(JSON.stringify(order, null, 2));

    console.log("\nSTEP 8: Prepare for a backend checkout");

    function createCheckoutPayload() {
    // Send IDs and quantities, not trusted client-calculated prices.
    return {
    items: Array.from(cart.entries()).map(([productId, quantity]) => ({
    productId,
    quantity
    }))
    };
    }

    console.log("Checkout request payload:");
    console.log(JSON.stringify(createCheckoutPayload(), null, 2));
    console.log("The backend must validate prices, inventory, and payment status.");

    Conclusion


    React provides a strong foundation for building e-commerce applications because its component model encourages reusable interfaces and predictable UI updates. When product data, cart operations, and pricing rules are separated into focused modules, developers can introduce features without turning the storefront into a difficult-to-maintain codebase.

    The example demonstrates the fundamentals, but production applications need additional safeguards, including server-side price validation, secure payment processing, persistent carts, authentication where appropriate, error handling, and automated tests. Inventory should be reserved and orders should be created through carefully designed backend workflows, especially when multiple customers can purchase the same product simultaneously.

    My recommendation is to start with a small, working storefront and introduce complexity only when the requirements justify it. Build reusable React components, keep business rules testable, measure performance on real devices, and treat checkout security as a core requirement from the beginning.

    What has been the biggest challenge in your React e-commerce projects: cart state management, performance, or integrating a reliable checkout flow?#javascript #react #webdev #ecommerce #software #coding #development #engineering #inclusive #community
    Building E-commerce Applications with React: A Practical Guide

  8. A user reported a crash on the export route: a null delivery date reached the date formatter and threw. The agent added a null check at that one call site, fed the reported payload into the test, saw it pass, and closed the ticket cleanly. Three days later the report route threw the exact same exception. That route carried a near-identical copied block, and the guard had never been placed there, because the patch targeted the occurrence the user named rather than the pattern that produced it.

    The agent had fixed the line in the stack trace. It had not fixed the condition that repeated on the next copy.

    Why the reported site becomes the only target


    Given a reported error, the agent's shortest path is to locate the line in the trace, patch it, and re-run the failing case. Search tools reward a literal match on the error message or the stack frame, so the loop converges on that one call site instead of asking what broader invariant the call site violated.

    Copy-pasted code makes this worse. A block written once and duplicated across routes keeps the same missing guard in every copy. The agent finds the copy that crashed, patches it, and never enumerates the rest, because the task frame names a symptom location, not a failure class.

    The test reinforces the trap. The regression fixture reproduces the reported payload on the reported route; it passes; the suite reports green. There is no assertion that the sibling construction behaves the same way, so green reads as solved.

    What a local fix leaves behind


    • Sibling copies keep the defect. Every duplicated block that builds the same unguarded value still throws when its own edge case arrives.
    • The guard special-cases one input. Checking a single call site protects that route, but leaves the underlying value able to reach a formatter null on any other path.
    • Tests cover only the reported case. The fixture mirrors the user's payload; the untouched copies exercise a shape the test never models.
    • The issue returns under a new ticket. The same exception filed from a different route looks like a fresh report instead of a known, ungeneralized fix.
    • The root cause stays unnamed. A commit that describes the one route never records the invariant, so the next agent has to rediscover the pattern from scratch.

    The tell is a completion summary that names the route or function the user quoted, with no mention of where else that construct appears.

    Generalize the pattern before you close


    A patch is complete when the condition cannot reach any call site, not when the reported one passes:

    • Find every site that builds the same value. Search for the pattern that produces the unguarded input, not just the literal line from the trace; copied routes and shared helpers are the likely homes of the next crash.
    • Name the invariant instead of the location. State what must hold before the formatter runs, then enforce that invariant at the boundary where the value is built, so every consumer inherits the guard.
    • Replicate the failing shape on the siblings. Run the null or edge input through each duplicated path before declaring the fix done; a guard that exists on one copy does not protect the others.
    • Let the commit describe the failure class. A message that says only "fix export date crash" leaves the recurrence undocumented; naming the invariant gives the next pass a place to start.
    • Ask who else constructs this value. Before closing, enumerate callers and entry points that reach the same code, and treat an unpatched sibling as open work rather than out of scope.


    An occurrence and a pattern are different sizes of problem


    Fixing the reported call site removes the crash the user saw. It does not remove the condition that crashes elsewhere. Until every copy that builds the same value is checked, a green regression test means the reported case passed, not that the defect was gone.#aiagents #debugging #testing #codequality #software #coding #development #engineering #inclusive #community
    The agent fixed the failing call site and left the same bug on its sibling

  9. In addition, there is an app if you need to print from your phone... And the printer is 100% wifi compatible.
    The ONLY complaint I have is that it doesn't come with a dedicated printer cable. And I have learned over the last decade that printer Wi-Fi has 4 prospective problems.
    1. If wifi isn't strong enough, connections are iffy. And many printers are truly only designed for Wi-Fi. The fact that they no longer include a printer cable is their way of pushing you to Wi-Fi printing.
    2. Wi-Fi traffic seems to heavily affect Wi-Fi signal strength, which makes #1 significantly more problematic.
    3. Ink subscriptions (especially after cancellation) will negatively influence ease of use. The manufacturer swears that subscriptions are not mandatory, but they do everything in their power to make the non-subsciption experience so unpleasant that most people will just keep the subscription to avoid the hoop-jumping requirements, to exit the subscription.
    But I happened to have the 10ft one I bought for the prior printer, because, after living in a lot of places where the WiFi is iffy, I prefer old school.
    4. Wi-Fi is hackable, most printer Wi-Fi is unsecured, and all printers keep a log. If I wanted the world to know what I am printing, I would post it on FB.

  10. I write code. I did not expect to spend so much of my career thinking about
    contracts.

    Three years ago my client agreement was two paragraphs in the body of an email.
    It said what I'd build and what it cost. Every clause I've added since then went
    in because something specific went wrong, and I'd rather you learn them from a
    blog post than the way I did.

    Not legal advice — I'm a developer, not a lawyer. Have someone qualified in your
    country read anything before you rely on it.

    1. Scope, with a "not included" list


    The included list is the easy part. The not-included list is what saves you:
    logo design, copywriting, photography, hosting fees, email migration, stock
    images, ongoing maintenance.

    Clients don't read "not included" as hostile. They read it as someone who has
    done this before.

    2. Payment in three parts


    50% before work starts, 30% at design approval, 20% before launch.

    The deposit isn't a formality. It's the difference between a client who is
    committed and a client who is exploring options.

    3. The deposit is non-refundable once work begins


    You turned down other work to hold those weeks. That's what the deposit pays for.

    4. Late payment stops work


    Not "may stop work". Stops. And the timeline moves by at least the length of the
    delay — your calendar doesn't grow a free week later just because they were slow.

    5. What the client owes you, with actual dates


    Content, logo files in vector format, hosting and domain access, feedback within
    a set number of working days. Put real dates next to each one, in the proposal,
    before anyone signs.

    6. The content delay clause


    If I could keep only one clause, it would be this.

    If content is more than X days late, the project goes on hold, and the invoice
    for work completed to that point becomes due. It rejoins my schedule when I have
    room — which might be weeks later.

    This sounds harsh until the third time a project dies because nobody wrote the
    About page. Almost every stalled project I've had stalled on content, not code.

    7. Revision rounds, and a definition of "round"


    A round is one consolidated set of feedback. Five emails over three days is five
    interruptions, not one round, and if you don't define it you will be the one
    absorbing the difference.

    8. Change requests in writing, before any work


    Client asks. You reply with cost and timeline impact. They confirm. Then you
    start.

    This isn't bureaucracy, it's protection in both directions. They never get a
    surprise invoice and you never do unpaid work. Small things I still absorb
    without mentioning — the clause exists for the "while you're in there, can we
    add a booking system" requests.

    9. Silence counts as approval


    If I ask for sign-off and hear nothing for X working days after one reminder,
    that stage is approved and we move on.

    Without this, one unresponsive client freezes your schedule indefinitely and
    you have no way to restart it.

    10. Ownership transfers on final payment


    Until the last invoice clears, the work is mine. The site goes live when payment
    does.

    This is the single most effective clause for getting a final invoice paid, and
    it has never once caused an argument with a client who intended to pay.

    11. One named decision-maker


    When feedback arrives from four people who disagree with each other, someone on
    the client's side has to resolve that before it reaches you. Name that person in
    the contract.

    12. What happens if either side walks away


    They pay for work completed. Anything prepaid and not yet worked against comes
    back. Agreeing this while everyone is still friendly takes five minutes;
    agreeing it afterwards takes a lawyer.

    None of this makes you difficult to work with. In my experience it does the
    opposite — clients relax when the person building their site clearly knows how
    projects go wrong, because it suggests you've finished a few.

    What's in your contract that isn't in mine? I'm still adding to this.#freelance #webdev #career #business #software #coding #development #engineering #inclusive #community
    The contract clauses I added after three years of client websites

  11. Well That’s Nicely Packaged

    By Cliff Potts, CSO, and Editor-in-Chief of WPS News

    Baybay City, Leyte, Philippines — 25 October 2026, 17:35

    A Thoughtful Presentation

    At a certain point, the platform begins to present information in a particularly tidy manner. Headlines are shortened. Images are cropped just so. Context is compressed into something quick and consumable.

    Everything looks clean. Orderly. Easy to take in at a glance.

    On Simplifying the Message

    Nuance is trimmed for convenience. Longer explanations are unnecessary when the essence can be delivered immediately. The important part is that the message arrives intact, even if some details are left behind.

    After all, attention is precious. Brevity is a kindness.

    Ready for Sharing

    The packaged item is designed to travel. A click, a reaction, a repost. No additional thought required.

    Interpretation is optional. The presentation does most of the work.

    A Mild Observation

    In polite conversation, one usually allows space for explanation before drawing conclusions. A summary would not replace the discussion itself.

    But bless their heart, they do like to keep things simple.

    #contentPackaging #digitalEtiquette #Facebook #headlines #informationDesign #SocialMedia #WPSNews
  12. Small detail that made me write this: when I asked Perplexity "How do I check if ChatGPT recommends my product?" on 24 Oct 2026, 2 of its 10 sources were dev.to posts. Not mine, other authors. So if you write about this topic here, you are on a platform that actually gets pulled into answers.

    Here is the method I use to check that week over week, without a paid tool. It is boring on purpose. Boring is reproducible.

    Why bother logging at all


    I ran 8 fixed buyer questions on ChatGPT, Gemini and Perplexity on 17 Oct and 24 Oct. Two things stood out in the data:

    • The engines barely share sources. In week 1, ChatGPT and Gemini overlapped on only 3 domains.
    • Gemini's source list mostly turned over in one week. Only a handful of URLs repeated.

    If the answers move that much, a single check tells you very little. You need the same questions, asked the same way, logged the same way, repeatedly.

    (And yes, for transparency: my own stuff appeared in 0 of 40 answers across both weeks. The method works fine for measuring zero.)

    Step 1: freeze your questions


    Write 8 to 20 questions a buyer would type, without your brand name in them. All three engines recommended testing somewhere between 10 and 50 prompts, so pick a number you will actually keep up.

    Then freeze them. Put them in a file, give each an ID, and never reword. Mine look like this:

    Q1 | How do I check if ChatGPT recommends my product?
    Q3 | What tools can I use to see if AI assistants cite my site?
    Q8 | What are cheap or free tools to monitor my brand's visibility in AI answers?

    If you change the wording in week 3, you cannot compare week 3 to week 1. That is the whole game.

    Step 2: control the session


    Record the session state as data, because it changes the answer:

    • ChatGPT: I use it logged out, web search at default.
    • Gemini: signed in to the same account every week (signed-in answers may be personalised, so note it).
    • Perplexity: logged-out use was blocked for me on all 8 questions in week 1 ("Sign up and repeat your request."), so I now use a free account.

    Perplexity's own answer to Q1 recommended running each prompt 3 times in a clean session, on different days. Gemini said 3 to 5 runs in a temporary chat the week before. I currently do one run per question per engine, which is the weak point of my setup. If you have the time, do 3 and record the run number.

    Step 3: log with a fixed schema


    This is the header of my log.csv, plus a run column I recommend adding:

    date,engine,question_id,run,web_search_or_sources_shown,cited_urls,brands_tools_named,our_presence,note

    A few rules that saved me later:

    • One row per answer. 3 engines x 8 questions = 24 rows per week.
    • Copy cited URLs exactly. Answer text can be summarized, but URLs are your real dataset. They are what lets you spot that dev.to showed up, or that 10 different small sites made up one source list.
    • Log the engine config in the row ("logged out, web search default on").
    • Log blocked runs as rows. My week 1 Perplexity rows say blocked. Missing data you documented is still data.
    • Separate "named" from "cited". A brand can be mentioned without a link, or linked without being recommended. Perplexity's Q1 answer suggested tracking whether you are named, your position, accuracy, competitors and cited URLs.

    Keep the raw answer for each row in its own text file (raw/2026-10-24/perplexity-Q1.txt). The CSV is for counting, the raw file is for rereading.

    Step 4: compute two simple numbers


    You do not need a dashboard. Two numbers per week are enough:

    • Presence rate: answers that name or cite you / total answers.
    • Source overlap: domains that appear in this week's list and last week's list, per engine.

    The second one is underrated. It tells you how stable the "slot" you are trying to win actually is.

    Step 5 (optional): the GA4 side


    Logging answers tells you if you are cited. It does not tell you if anyone clicks. On the two GA4 questions, all three engines gave essentially the same answer both weeks: use GA4's AI Assistant channel, check session source/medium, and build a custom channel group above Referral with a regex. Perplexity's version of the filter:

    chatgpt\.com|chat\.openai\.com|openai\.com|perplexity\.ai

    Two caveats the engines themselves gave: some AI visits land as Direct, and Perplexity traffic can still show up under Referral even with the AI Assistant channel. I do not have my own GA4 numbers to share here, so treat this as the consensus answer, not my results.

    What the engines will not tell you


    Every engine now recommends a manual spreadsheet, alongside tools like Otterly, Peec, Profound and the HubSpot AI Search Grader. The method is not a secret. What the free advice skips is discipline: frozen wording, controlled sessions, exact URLs, week-over-week comparison.

    I am on week 2 of doing this in public. If you run the same kind of log, I would genuinely like to compare overlap numbers in the comments.#seo #ai #analytics #tutorial #software #coding #development #engineering #inclusive #community
    A reproducible way to log whether ChatGPT, Gemini and Perplexity cite you (with the CSV I use)

  13. “You Can See Everything”: Holmes & Watcher

    Previously on Midlife Crisis Crossover: Once in a blue moon I'll see a documentary in theaters! Usually those blue moons wax during Oscars season, then wane for the other forty-odd weeks of the year. Last month I already met my non-Oscars documentary quota for the decade with Linkin Park's half-doc/half-concert film, but that one was a special occasion for music fandom. Here we are again with another brand new doc, and for one of the oldest moviegoing reasons of all: it's The New Movie No One Online Will Shut Up About -- not critics, not entertainment sites, not even my local comic shop, which doesn't sell movies and stands to gain nothing from bringing it up. Last weekend You Can See Everything was the #2 film at the American box office, right behind the big video-game flick and well ahead of the entire Halloween-season horror parade. It mesmerized critics when it premiered last month at Telluride Film Festival, who were converted into its front-line proselytizers and have now preempted all other programming and trains of thought just so they can keep extolling its surreal nesting-doll structure of eye-popping twists within twists with as few spoilers as possible. I'll try doing the same here, because it is worth walking into unwittingly, but there is just so much to it. […]

    midlifecrisiscrossover.com/202

  14. This has been a rough week for cyber defenders. Colleagues, friends, sleepless zombies, I am writing to assure you - the week is dead and over. Good riddance.

    Things will be tough for a while, but as usual, good people get together and fix problems. The Sun rises, and we get stuff fixed.
    Vulnpocalypse or not, we got this. And, technology will catch up.

    Until then, risk leaders:
    1. We must make the case for an extreme landscape shift, and ask for significantly more budget. If we don't get it - I'd consider leaving for an org that does realize the change. You're in high demand.

    2. Stay relevant. Get yourself and your people on agents. Secure your agents.

    3. Prioritize, and reprioritize. We can't do everything.

    4. And while we will keep at it, self-care is not an effin' joke and should be a priority for our teams. Marathon != sprint.

    --
    And as always, when you want to secure your agents - do keep Knostic in mind.

  15. The Need for Speed: Unlocking Your Website's Potential with the Critical Rendering Path


    Ever felt that pang of impatience waiting for a website to load? You know, that agonizing moment where the screen is just a blank canvas, and you start questioning your internet connection, your life choices, anything to explain the delay? We've all been there. In the blink-and-you'll-miss-it world of the internet, speed isn't just a nice-to-have; it's the make-or-break factor for user engagement, conversion rates, and even your search engine ranking. And at the heart of this speedy performance lies a concept called the Critical Rendering Path (CRP).

    Think of your website as a delicious cake. To bake that cake and present it to your eager guests (your users), you need a recipe. The CRP is essentially the most efficient recipe for building your website's visual representation on the user's screen, as quickly as possible. It's about understanding the essential ingredients and the most direct steps to get that cake out of the oven and onto the table.

    This article will dive deep into the fascinating world of the Critical Rendering Path. We'll break down what it is, why it's so darn important, and how you can optimize it to make your website lightning-fast and your users incredibly happy. So, buckle up, grab a virtual coffee, and let's get cracking!

    What Exactly is This "Critical Rendering Path" Thing Anyway?


    Imagine you're building a LEGO castle. You can't just throw all the bricks together randomly. You need a plan, a sequence. First, you lay the foundation. Then, you build the walls, followed by the towers, and finally, you add the decorative flags. The Critical Rendering Path is the web browser's equivalent of this LEGO plan.

    In technical terms, the Critical Rendering Path refers to the sequence of steps a web browser takes from the moment it receives HTML and CSS to the point where it can visually render pixels on the screen. It's the chain of events that must happen for your user to see your beautiful website.

    Let's break down these steps:

    1. Parsing HTML: The browser receives the HTML document and starts parsing it, creating a Document Object Model (DOM). The DOM is like a tree-like structure representing the content and hierarchy of your HTML.
    2. Processing CSS: As the browser encounters CSS in your HTML (either inline, in <style> tags, or linked external stylesheets), it parses this CSS and creates a CSS Object Model (CSSOM). The CSSOM represents the styles applied to your DOM elements.
    3. Combining DOM and CSSOM into a Render Tree: This is where the magic starts to happen. The browser combines the DOM and CSSOM to create a Render Tree. The Render Tree contains only the visible elements of your page and their associated styles. Elements like <head> or elements with display: none; are excluded.
    4. Layout (or Reflow): With the Render Tree in hand, the browser needs to figure out the exact position and size of each element on the screen. This is the layout or reflow process. It's like measuring and marking where each LEGO brick goes.
    5. Painting (or Rasterization): Finally, the browser takes the layout information and "paints" the pixels onto the screen. This is the painting or rasterization step, where your website finally comes to life visually.

    Crucially, the CRP is "critical" because any delay in these steps will directly impact the perceived loading speed of your page. If one step is slow, the entire process is held up.

    Why Should You Even Care About the CRP? (The "Advantages" Section, aka "Why You Need This Speed!)


    Optimizing the Critical Rendering Path isn't just an exercise for web developers to show off their technical prowess. It has tangible, real-world benefits for your website and your business.

    • Blazing-Fast User Experience: This is the most obvious and impactful advantage. Users get to see content sooner. This leads to less frustration, more engagement, and a higher likelihood of them sticking around. Imagine landing on a site and seeing content appear within seconds rather than staring at a blank screen. That's the power of CRP optimization.
    • Improved Conversion Rates: When users can quickly see and interact with your product or service, they are more likely to convert – whether that's making a purchase, signing up for a newsletter, or filling out a form. Speed directly translates to revenue.
    • SEO Boost: Search engines like Google absolutely love fast websites. A good Core Web Vitals score, heavily influenced by CRP performance, is a significant ranking factor. A faster site can mean higher search engine rankings, leading to more organic traffic.
    • Reduced Bounce Rates: If your site takes too long to load, users will likely hit the "back" button and try a competitor. Optimizing the CRP helps keep users on your site longer.
    • Mobile-First Performance: With the majority of internet traffic coming from mobile devices, optimizing for speed on these networks is paramount. CRP optimization is especially critical for mobile users who often have slower connections.


    The Flip Side of the Coin: Potential "Disadvantages" (Or, "Why It's Not Always a Walk in the Park")


    While the benefits are undeniable, optimizing the CRP isn't always a straightforward process. There are challenges and considerations to keep in mind.

    • Complexity and Learning Curve: Understanding the intricacies of the CRP and implementing effective optimizations can be challenging. It requires a good grasp of web technologies and how browsers work.
    • Balancing Performance with Functionality: Sometimes, aggressive optimization might involve trade-offs. For instance, deferring non-critical JavaScript might mean certain interactive elements appear slightly later. Finding the right balance is key.
    • Requires Ongoing Maintenance: The web is constantly evolving, and new content or features can impact your CRP. It's not a "set it and forget it" kind of optimization. Regular monitoring and adjustments are necessary.
    • Potential for Over-Optimization: While rare, it's possible to get so caught up in optimizing that you might accidentally break something or make your code less readable and maintainable.
    • Tooling and Debugging: Identifying and fixing CRP bottlenecks can sometimes involve complex debugging and the use of specialized performance tools.


    Key "Features" of a Well-Optimized Critical Rendering Path (The "How-To" Section)


    Now that we understand what the CRP is and why it matters, let's get to the good stuff: how to actually optimize it! This is where we get hands-on with some actionable strategies.

    1. Minimize the Critical HTML & CSS


    The core idea here is to reduce the amount of data the browser has to process for the initial render.

    • Inline Critical CSS: This is a game-changer. Instead of waiting for an external CSS file to download, you embed the CSS required to render the above-the-fold content directly within your HTML. This allows the browser to start rendering immediately.

      Example:

      <!DOCTYPE html>
      <html>
      <head>
      <title>My Speedy Page</title>
      <style>
      /* Inline critical CSS for above-the-fold content */
      body {
      font-family: sans-serif;
      margin: 0;
      }
      .hero-section {
      background-color: #f0f0f0;
      padding: 50px;
      text-align: center;
      }
      h1 {
      color: #333;
      }
      </style>
      <!-- Link to non-critical CSS -->
      <link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
      <noscript><link rel="stylesheet" href="styles.css"></noscript>
      </head>
      <body>
      <section class="hero-section">
      <h1>Welcome to My Fast Website!</h1>
      <p>Content that loads instantly.</p>
      </section>
      <!-- Rest of your content -->
      </body>
      </html>

      Explanation:

      • The <style> block contains the CSS needed for the .hero-section to be visible immediately.
      • The link rel="preload" with as="style" tells the browser to fetch the styles.css file but not to block rendering. onload then applies it once downloaded.
      • The noscript tag ensures that users with JavaScript disabled still get the stylesheet.


    • Minify HTML and CSS: Remove unnecessary characters (whitespace, comments) from your HTML and CSS files. This reduces file sizes, leading to faster downloads. Many build tools (like Webpack or Gulp) and online minifiers can do this automatically.


    2. Defer and Asynchronously Load JavaScript


    JavaScript can be a major bottleneck in the CRP. When the browser encounters a <script> tag, it typically stops parsing HTML, downloads the script, executes it, and then resumes parsing. This is often unnecessary for scripts that aren't immediately needed for rendering.

    • defer Attribute: This attribute tells the browser to download the script in the background while continuing to parse HTML. The script will then execute only after the HTML parsing is complete.

      Example:

      <script defer src="my-non-critical-script.js"></script>

    • async Attribute: This attribute also downloads the script in the background, but it executes the script as soon as it's downloaded, potentially before HTML parsing is complete. This is useful for independent scripts that don't rely on the DOM.

      Example:

      <script async src="my-analytics-script.js"></script>

    • Move Scripts to the End of <body>: While defer and async are preferred, a common older technique is to place all your non-critical JavaScript just before the closing </body> tag.
    • Code Splitting: Break down your JavaScript into smaller chunks. Load only the JavaScript that's necessary for the current view or interaction. Tools like Webpack excel at this.


    3. Optimize Images


    Images are often the largest assets on a webpage and can significantly impact loading times.

    • Optimize Image Files: Compress your images without sacrificing visual quality. Use tools like TinyPNG, ImageOptim, or even online compressors.
    • Use Modern Image Formats: Consider using formats like WebP, which offer better compression and quality compared to JPEG or PNG.
    • Responsive Images: Use the <picture> element or srcset attribute to serve appropriately sized images for different screen sizes and resolutions.

      Example:

      <picture>
      <source srcset="large-image.webp" media="(min-width: 1024px)">
      <source srcset="medium-image.webp" media="(min-width: 600px)">
      <img src="small-image.webp" alt="A descriptive alt text">
      </picture>

    • Lazy Loading: Defer the loading of images that are not immediately visible on the screen (i.e., below the fold). They will only load when the user scrolls down.

      Example:

      <img src="your-image.jpg" loading="lazy" alt="Descriptive alt text">


    4. Leverage Browser Caching


    Caching allows the browser to store copies of your website's resources (HTML, CSS, JavaScript, images) locally. This way, on subsequent visits, the browser can load these resources from the local cache instead of re-downloading them from the server, dramatically speeding up loading times.

    • Set Appropriate Cache Headers: Configure your web server (e.g., Apache, Nginx) to send Cache-Control headers for static assets.

      Example (Nginx configuration):

      location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|webp)$ {
      expires 1y;
      add_header Cache-Control "public, no-transform";
      }


    5. Prioritize Above-the-Fold Content


    The "above-the-fold" content is what users see immediately when they land on your page without scrolling. This is the most critical part to get right for a good initial impression.

    • Identify Critical Resources: Determine which HTML, CSS, and JavaScript are absolutely essential to render this initial viewport.
    • Inline Critical CSS: As mentioned earlier, this is key for visual content.
    • Defer Non-Critical JavaScript: Move or defer scripts that aren't needed for the immediate display of above-the-fold content.


    6. Reduce Server Response Time


    Even with optimized front-end assets, a slow server can still cripple your CRP.

    • Optimize Server-Side Code: Ensure your backend code is efficient and doesn't take too long to generate the HTML response.
    • Use a Content Delivery Network (CDN): CDNs distribute your website's assets across multiple servers globally. This means users can download assets from a server geographically closer to them, reducing latency.
    • Enable HTTP/2 or HTTP/3: These newer protocols offer significant performance improvements over HTTP/1.1, especially for handling multiple requests concurrently.


    7. Eliminate Render-Blocking Resources


    Any resource that prevents the browser from rendering the page until it's downloaded and processed is considered "render-blocking."

    • Identify Render-Blocking CSS and JavaScript: Use browser developer tools (Performance tab) to identify these bottlenecks.
    • Inline Critical CSS: The primary solution for render-blocking CSS.
    • Defer/Async JavaScript: The primary solution for render-blocking JavaScript.


    Tools for the Job (Your Performance Toolkit)


    To effectively optimize your CRP, you'll need the right tools:

    • Browser Developer Tools: Your best friend! Chrome DevTools, Firefox Developer Edition, and Edge DevTools offer invaluable features:
      • Performance Tab: Record page loads to analyze the CRP, identify bottlenecks, and see how long each step takes.
      • Network Tab: Inspect all network requests, their sizes, and timings.
      • Lighthouse: An automated tool built into Chrome DevTools that audits performance, accessibility, SEO, and more. It provides actionable recommendations for CRP optimization.


    • WebPageTest: An online tool that allows you to test your website's speed from various locations and browsers.
    • GTmetrix: Another popular online tool for analyzing website speed and performance.
    • Google PageSpeed Insights: Provides a score for your page's performance on both mobile and desktop, with specific recommendations.


    Conclusion: Embrace the Speed!


    The Critical Rendering Path is a fundamental concept for anyone serious about website performance. By understanding how browsers construct your webpages and by strategically optimizing the resources that contribute to the initial render, you can unlock a world of benefits: happier users, higher conversions, and better search engine rankings.

    It's not about magic tricks; it's about a systematic approach to delivering your content efficiently. Start by identifying your current CRP bottlenecks, then implement the strategies discussed – inline critical CSS, defer JavaScript, optimize images, leverage caching, and prioritize above-the-fold content.

    Remember, website performance is an ongoing journey, not a destination. The web is dynamic, and your optimizations will need to adapt. But by making the Critical Rendering Path a core part of your development process, you'll be well on your way to building faster, more engaging, and ultimately, more successful websites. So, go forth and optimize – your users (and your bottom line) will thank you for it!#frontend #performance #webdev #software #coding #development #engineering #inclusive #community
    Optimization: Critical Rendering Path

  16. Tues. Oct. 27, 2026: Still Shambling Around Like a Zombie

    image courtesy of icholas Panek from Pixabay

    Tuesday, October 27, 2026

    Last Day of the Full Moon

    Neptune, Saturn, Chiron, Uranus, Venus, Mercury Retrograde

    Sunny and cool

    Yessiree Bob, Mercury is Retrograde again. Try to avoid signing contracts or buying anything big. Find cool stuff in thrift shops. Think A LOT MORE before you say a word – even more important when Mercury and Venus are retrograde at the same time.

    Friday was sunny and cold. I was out of the house on time and at CVS for my COVID shot. No worries, no hassle this time. Getting home was a little fraught – more delays than usual, things slower, etc., and I started feeling the effects of the shot faster.

    I usually feel it within 20 minutes, then it steadies out for 6-8 hours, then I’m miserable for however many days I’m down.

    This time, I started feeling it in 10 minutes. I made it home, but my arm was quite sore within the first half hour. I’d drunk the 16 oz. of water the hour before the shot, as instructed. I continued to be thirsty, and by noon (my shot was at 9), I had consumed a gallon of water, and wanted more. So that was new and different. But I went with it. I’m not much of/enough of a water drinker, but I craved it and trusted it.

    I started feeling weary early on, and my nerve endings were on fire. I imagine this is what a fibromyalgia flare feels like. My joints also ached, and creaked loudly every time I moved, to the point it woke up the cats. New and different. I’ve always had muscle aches (which I also had), but not the nerve/joint stuff to this extent. I had some sense of brittle joints last go-round, but it was different than this, and moved through in about 5-6 hours. All of this will go in a document to the John Hopkins study in which I’ve participated in for the last handful of years. That’s why I paid such close attention.

    I took care of some business that needed attention while I was still coherent, drank as much water as I wanted, and took up residence on the sofa in the sunshine with the cats.

    I’m usually ravenously hungry on the first day of the shot, but was not. I was mildly nauseated for a couple of hours, but it passed.

    I wrote while I still could, and had books still close at hand for when I started to wind down. The headache came in faster, too, this time around, within three hours instead of the usual 6.

    I hoped that symptoms coming in hard and fast meant they’d flow through faster, too. But that’s why I blocked out several days. So that the only thing I needed to do was heal.

    I was actually functional enough to cook dinner using some CSA ingredients. I went to bed early, so tired I could barely drag myself there.

    I woke up a little after midnight on Saturday with severe chills. I added the featherbed to the blanket cover, which helped. Charlotte even allowed Tessa to come on the bed and help warm me.

    Then the muscle aches began. Everything hurt as badly as the first vaccine with Moderna way back in the day. I couldn’t take Tylenol because it made me so nauseated. I finally fell asleep, waking up a few hours later with a fever. Got back to sleep, woke up with chills.

    At one point, I could swear Charlotte and Willa were swinging from the ceiling fan in my office, but I could have had audio hallucinations.

    I moved to the sofa around 6 and slept there all day. I woke up every 3 or 4 hours for about 15 minutes or so, and went right back to sleep. I did manage a few sentences of free-writing, so I didn’t miss a day. I couldn’t even tie my hair back, because it hurt too much.

    I tried to eat, but everything tasted like wet cardboard, and nauseated me even more. I couldn’t eat more than 2 or 3 bites of anything. I drank as much liquid as possible, although I could only stand a few sips of coffee.

    You know it’s bad when I don’t drink coffee.

    At least when I was asleep, I wasn’t aware of how bad I felt.

    I was back in my own bed by 6 PM.

    I woke up around 1:30 on Sunday morning, feeling a little better. I managed to get back to sleep, and even had a little bit of dreaming, a good sign.

    I got up at the usual time and slowly fed the cats. I wasn’t up to yoga or much meditation, but I did a bit of free-write.

    I managed to eat a little breakfast. By mid-morning, I could do the Community Tarot Reading for the Week, which you can read here.

    I spent most of the day on the couch, reading. I read a book by one of my favorite authors that was a disappointment. It focused on the pain without the whimsy or joy that her previous novels have. While I respect her trying something new, and it technically had a happy ending, I missed the small moments of beauty that I love so much in her work. I read a book by a different author whose work I’ve read for years. Some of her work I’ve loved, some didn’t do it for me. This, sadly, was the latter, and it was in present tense. I realize she’s changed her style for market reasons, but she’s also lost the complexity that drew me to her work in the first place.

    So not a satisfying reading day!

    I heated up some leftovers for dinner, and could actually taste the food again, which was an improvement.

    I was in bed again by 6:30.

    I woke up around 1:30 on Monday, feeling a little better, and plotted out a good bit of the next ghostwriting assignment.

    Fell asleep again, and dreamed I was at a conference center. There was a poetry convention in one section and a mystery convention in the other, and I kept running back and forth between them. Not the most restful of dreams, but an improvement over the weekend.

    Woke up again at the usual time, and fed the cats, and that just about did me in. I did a few yoga poses on the floor, with Tessa snuggled beside me, and then the 40-minute meditation and the 15-minute free-write.

    I played with some of my out-of-the-box ideas to protect my sites, as well as collecting some practical tools.

    There’s also this: Theft is a crime. A company putting it in its “terms of service” doesn’t make it less of a crime. So I’m filing with my state AG, and also contacting my state and federal reps about it.

    WP won’t allow me to install an AI blocker on this blog without paying a subscription fee, so I’ll be using one of the out-of-the-box solutions for the blog. I specifically don’t want this to be part of one of my websites, although I considered making a subdomain and exporting everything.

    Again, during a Mercury Retrograde? Big mistake.

    I am looking at some alternative social media platforms. Both Upscrolled and Monnett look good. Those would be sites where I wouldn’t have to keep posting about new releases cyclically for promotion. I could post once and be done. Cara, Joust, Curate, and PeakD don’t seem to be the right fit right now. I might try Curate at some point, when I have more visual work. Haven sounds promising, but isn’t even in Beta yet. Eh!, the Canadian social network, sounds like fun, but they might not want Americans at this point. I really miss Ello.

    I think when curation is too narrow, you miss a lot of cool stuff.

    I will spend more time on Bluesky, Mastodon, and Tumblr, too. I have accounts, I use all three in different ways, but I need to use them better.

    For now, I’ve switched my accounts on Meta to personal, rather than business. I removed my lkn.bio. When they decide to expand the theft to personal, I may well just delete everything.

    Maybe I just need a few months to pull back from many things, and figure out new ways of rebuilding. It means a financial hit, and it probably isn’t worth it to release a new holiday short this year.

    And I’ll do my out-of-the-box protections which are designed to have a ripple effect over time with serious consequences for assholes. No, I’m not going into detail. I will start using either Glaze or Nightshade for images.

    All of that took more time than I would have liked, but that’s the way it goes. Retrogrades slow things down.

    And, I noticed that when I was responding to comments on other posters’ IG accounts about these issues, when they replied to me, I could not reply back and continue the conversation.

    Really makes me want to delete all the Meta and just suck it up. I’ve successfully lived without the dystopian version of what used to be Twitter. I miss what it was at its best, not what it became.

    I’m going to lose touch with a bunch of people. I’m not doing monthly subscriptions to anything. Not because I don’t want to, but as a freelancer, I cannot commit to anything monthly beyond my bills when I never know when I will get paid. Bills must be covered first. Then I spend money locally and with individual artists. Even a small monthly subscription can put me behind, so I don’t do them. Not only don’t I want to live by subscription. I can’t. I literally can’t.

    I remember how devastated I was moving off Twitter. This just makes me angry. I’m not surprised, but I’m angry.

    I’ve never given up analogue everything – writing, music, etc. So it’s just time to hunker down for a bit. I’m selling books locally over the holidays at a few places. I’ll put sell sheets into the books, too, with information about the rest.

    And I need to find something for when the ghostwriting contracts are done, which will be fairly soon.

    Speaking of ghostwriting, I had a really good session on it, and I hope I can keep that momentum up. I even got ahead of where I hoped.

    I also read the scripts for tomorrow’s literary committee meeting.

    I was wiped out by then.

    I’m not one much for frozen meals, but I hate making lasagna (weird, I know).  I found a frozen lasagna by a company out on the other side of the state in Quincy, MA, so I bought one last week, figuring there would be days I wasn’t up to cooking post-booster. I slapped it into the oven last night and hoped for the best.

    It was actually pretty good. And my taste buds are working again, so I wasn’t imagining it. I would buy it again, and try their other products, and have one or two on hand for nights I can’t face the stove.

    I read a little bit in the evening. I’m caught up on all the library books, so it was time to dig into my own TBR pile.

    Went to bed a little earlier than usual but later than I have been, and couldn’t sleep. So I guess I’m getting back to “normal”?

    Finally got to sleep, only to be woken up when Willa pulled a Houdini and my mom couldn’t find her. We found her, got her back into my mom’s room, and I went back to sleep, and then overslept until 6:30 this morning to start the routine.

    The routine felt better this morning, even the yoga. I had a good free-write session, jiggling a lot loose.

    After breakfast, I will get a crockpot marinara sauce going, take out the garbage, pick up the mail, vacuum, get some writing done, and then switch over to the ghostwriting in the afternoon. I will take breaks as I need them, and not push too hard.

    My friend’s surgery went well yesterday. She has a long recovery ahead of her, but excellent care, and that’s always a relief.

    Have a good one!

    #CovidBooster #freelance #health #life #metaTheft #research #socialMedia #writing
  17. DATE: October 27, 2026 at 07:00AM
    SOURCE: PSYPOST.ORG

    ** Research quality varies widely from fantastic to small exploratory studies. Please check research methods when conclusions are very important to you. **
    -------------------------------------------------

    TITLE: We’ll pay to get revenge on an algorithm, even though it can’t feel a thing

    URL: psypost.org/well-pay-to-get-re

    When a computer algorithm treats people unfairly, they tend to get just as angry and retaliate just as often as they would against a human wrongdoer. A new series of experiments published in Journal of Experimental Psychology: General provides mixed evidence on whether punishing a machine brings the same sense of closure as punishing a person, but it suggests that a machine’s response to being punished, such as sounding hurt or promising to make fairer offers, can strengthen people’s sense that justice was done. The findings suggest that as artificial intelligence takes on more decision-making roles in society, organizations may need to design systems that can communicate accountability when things go wrong.

    Automated systems are increasingly tasked with consequential choices, from screening job applicants to steering vehicles and prioritizing medical care. To understand how people react when these systems cause harm, psychologists study a concept known as mind perception, which is the everyday process of judging what kind of mental life another entity possesses. People generally evaluate minds along two separate dimensions: agency, meaning the ability to think, plan, and act intentionally, and experience, meaning the capacity to feel physical pain, pleasure, fear, and emotions.

    In human interactions, the capacity to commit a moral wrong and the capacity to experience punishment usually go together, since a sane adult can both plan a harmful act and feel the sting of a penalty. Artificial intelligence splits these two qualities apart because people often view machines as having enough agency to cause deliberate harm, yet almost no ability to feel pain or remorse. For instance, research covered by PsyPost in 2023 found that people judged AI agents as more deserving of blame than humans in one classic life-and-death dilemma. Similarly, another 2023 study covered by PsyPost showed that people hold automated driving assistants responsible for road outcomes while simultaneously categorizing the software as a mere tool rather than a true moral being.

    This mental divide raises questions about whether punishing an algorithm can produce justice satisfaction, which is the feeling of closure, fairness, and resolution a victim experiences after an offender is penalized. Psychological theories generally propose two reasons why punishment feels satisfying: either it fulfills a desire for retribution by making the wrongdoer suffer for their actions, or it serves a communicative role by teaching the wrongdoer a moral lesson.

    Because people tend to see machines as unable to genuinely suffer or feel guilt, study author Alexander Eng, an associate professor of organizational behavior in the Department of Management at the Asia School of Business in Kuala Lumpur, and co-author Kai Chi Yam of the National University of Singapore examined how people emotionally and behaviorally respond during and after they penalize an unfair algorithm.

    “Research on punishment usually assumes that anyone capable of doing wrong can also be punished,” Eng told PsyPost. “We tend to see a young child as unable to truly commit a wrong, and so also as unfit for punishment. Machines break that link: people see AI as able to make decisions that hurt them, yet unable to feel pain, regret, or learn a moral lesson. As AI takes on decisions like medical triage and firing employees, we wanted to know how people respond when they try to hold it accountable, and whether punishing it gives them any sense that justice was done.”

    The researchers began with a pilot study of 380 English-speaking adults in the United States, recruited through the online platform Prolific, to verify whether people actually punish algorithms. Participants played a single round of an economic exercise called the ultimatum game, in which a partner was given £0.50 and proposed how to split it. If the participant accepted the split, both parties kept their share, but if the participant rejected it, neither party received anything, making rejection a form of costly punishment.

    Participants were told their partner was either another human participant or an algorithm, and they received either a fair offer of £0.25 each or an unfair offer where the partner kept £0.45 and left the participant just £0.05. In reality, the researchers preset all offers. Receiving a stingy offer from an algorithm provoked much higher anger (an average of 3.12 on a 5-point scale) than receiving a fair offer from an algorithm (1.31). When given the unfair deal, participants felt comparable anger toward algorithms (3.12) and humans (2.91), and they punished the unfair algorithm by rejecting its offer 57.8 percent of the time, which was not statistically different from the 62.2 percent rejection rate for unfair humans.

    In their first main experiment, the authors examined what happens after punishment is delivered using a final sample of 123 Prolific participants. Every participant received the unfair £0.05 offer in the ultimatum game from either a human or an algorithm, decided whether to accept or reject it, and then answered five questions measuring their justice satisfaction, such as whether they felt everyone got what they deserved. Afterward, participants played a second exercise called the dictator game, where they were given £0.50 and could unilaterally share any amount in £0.05 increments with their partner, while also having the option to switch to a new human partner first.

    As in the pilot study, participants rejected unfair offers from algorithms (38 out of 62) and humans (40 out of 61) at similar rates. Overall, the 78 participants who punished their partner by rejecting the offer reported higher justice satisfaction (3.57 out of 5) than the 45 who accepted it (2.63). Controlling for whether participants switched partners, the satisfaction gap between those who punished and those who did not was larger when the offender was a human than when it was an algorithm, and higher justice satisfaction in turn predicted greater generosity in the second game.

    Because the option to switch partners or the belief that computers have no use for money might have influenced the first experiment, the researchers conducted a second study with a stricter setup among 739 participants, preregistered along with the third and fourth experiments through the journal’s registered-report review process. Participants were told that five algorithms and five human research assistants were competing across multiple negotiations, and that while neither kept the money personally, the lowest-earning algorithm and human would be eliminated from the competition.

    Participants were not allowed to switch partners between the ultimatum game and the dictator game, and they also completed scales measuring their partner’s perceived agency and emotional experience, along with their own baseline tendency to attribute human-like consciousness to technology, a trait known as anthropomorphism.

    Participants rated human partners higher on agency (3.30 versus 2.79 out of 5) and much higher on the capacity for emotional experience (3.20 versus 1.86) than algorithmic partners. Even so, participants rejected the unfair offer at comparable rates for algorithms (71.0 percent, or 262 of 369) and humans (65.4 percent, or 242 of 370), and those who punished their partner felt much greater justice satisfaction (3.53) than those who accepted the unfair split (2.71). In contrast to the first study, after controlling for baseline anthropomorphism, the link between punishing and justice satisfaction, and in turn generosity, was equally strong whether the partner was an algorithm or a human.

    “People react to an unfair machine much as they react to an unfair person,” Eng said. “Participants got just as angry at an algorithm that made them a lowball offer as at a human who made the same offer, and they were just as willing to give up their own money to punish it. Whether punishing the machine felt as satisfying was less consistent across studies.”

    A third study tested these dynamics in a different scenario called the trust game with 735 participants who chose to invest £0.20 with a human research assistant or an algorithm. The investment was tripled to £0.60, and the partner broke the participant’s trust by returning just £0.10 instead of a fair £0.30 split. Participants could then penalize their partner by recommending on a 1-to-5 scale that the partner be removed from the player pool, before rating their justice satisfaction and playing a second round where the roles were reversed.

    Participants gave similar removal ratings to unfair algorithms (3.37 out of 5) and unfair humans (3.26). Unexpectedly, harsher removal ratings were associated with lower justice satisfaction rather than higher closure. The authors suspect this is because participants only submitted a recommendation and never saw a penalty take effect, so the ratings may have reflected anger more than punishment. In an exploratory analysis looking directly at anger, feeling angrier predicted lower justice satisfaction and less generosity toward both types of partners, with anger reducing justice satisfaction slightly more when the partner was human than when it was an algorithm.

    In a fourth study involving 3,684 participants who rejected the unfair £0.05 offer in the ultimatum game, the researchers tested whether a message from the penalized partner could increase justice satisfaction. Immediately after rejecting the offer from a human or an algorithm, participants received either no message at all, a message expressing emotional distress over repeated rejections, a message calmly acknowledging that the offer was too low and promising to be fair in the future, or a combined message expressing both distress and a moral lesson learned. A separate preliminary test with 305 people confirmed that these messages effectively conveyed emotional suffering and moral learning as intended.

    Across the entire sample, participants paired with an algorithm reported slightly lower justice satisfaction (3.56 out of 5) than those paired with a human (3.66), a small difference that accounted for about half a percent of the overall variation in satisfaction scores. However, receiving a message from an algorithm expressing emotional suffering (3.57) or moral learning (3.62) produced higher justice satisfaction than receiving no response from the algorithm (3.42).

    For human partners, the differences between receiving no message (3.57) and receiving a suffering (3.66) or moral learning (3.69) message were not statistically significant after adjusting for multiple comparisons. Still, the boost from a message was not statistically larger for algorithms than for humans, and combining both messages added no measurable benefit beyond either one alone. The results suggest that a response from a machine can help satisfy people’s need for redress, even though participants rated algorithms as far less capable of feeling than humans.

    “We expected an apology or a show of remorse from an algorithm to count for little, since people don’t believe algorithms feel anything,” Eng explained. “Yet those messages raised people’s sense of justice for algorithms at least as much as the same messages did for humans. It was also striking that people paid to punish an algorithm that couldn’t keep the money and couldn’t experience the loss.”

    A final supplemental experiment with 1,093 participants examined whether dissatisfaction after being wronged causes people to take out their frustration on an innocent bystander, a behavior known as displaced aggression. Participants received the unfair £0.05 offer in the ultimatum game from a human or an algorithm, decided whether to accept or reject it, and then played the dictator game paired with a brand-new human research assistant who had no involvement in the first round.

    Controlling for baseline anthropomorphism, participants who punished their initial partner by rejecting the unfair offer shared slightly more money with the innocent bystander (an aggression score of 6.75 versus 7.07 on an 11-point scale, where higher scores mean less money shared) than those who did not punish, regardless of whether the original wrongdoer was a person or a machine.

    “The anger and punishment results held up across more than 6,000 participants,” Eng noted. “The machine-versus-human differences in justice satisfaction were small where they appeared at all: in our largest study, of about 3,700 people, partner type explained roughly half a percent of the variance. I’d treat that as a modest pattern that needs more testing.”

    As with all research, there are some caveats to consider when interpreting these results. All of the experiments relied on brief online financial games where the harm consisted of being offered an unfair split of £0.50 by an anonymous text-based partner. How people think and feel when a simple computer program shortchanges them by a few cents may differ from how they react to high-stakes algorithmic harm in the real world, such as an automated system wrongfully denying a mortgage, firing an employee, or causing a traffic accident. In addition, participants chose for themselves whether to punish, so differences between those who punished and those who did not may partly reflect who chose to punish rather than the effect of punishing itself.

    “These were online economic games with small stakes, splitting 50 pence,” Eng pointed out. “Real harms from AI, like a denied loan or a wrong diagnosis, carry much more weight, so the effects could look different there. The justice satisfaction results were also mixed: one study found a clear gap between machines and humans and another found none, so I wouldn’t claim that punishing machines never satisfies people.”

    The evidence on whether punishing a machine feels less satisfying than punishing a person was mixed across the studies, appearing in the first and fourth experiments but not in the second, while the third experiment’s punishment measure did not work as intended. The clearest gap came from the smallest experiment, which included 123 participants after dozens of duplicate entries were removed and which had originally been preregistered to test different outcomes; the larger, preregistered second experiment did not replicate it.

    The authors also noted that their five-item survey measuring justice satisfaction showed relatively low internal consistency in the fourth study, indicating a need to develop more precise tools for measuring psychological closure after technological failures. Future research could explore how different types of real-world errors and corrective feedback shape public trust, helping engineers and policymakers design accountability measures, such as holding human creators rather than machines responsible, that satisfy human intuitions of fairness.

    “We want to test other kinds of wrongdoing and punishment beyond economic games, and develop a better measure of justice satisfaction,” Eng added. “In a related project, I’m studying the ‘AI disclosure penalty,’ where people value content less once they’re told AI made it.”

    The study, “Artificial Intelligence and Machines Are Capable of Harm, but Not of Experiencing Punishment,” was authored by Alexander Eng and Kai Chi Yam.

    URL: psypost.org/well-pay-to-get-re

    -------------------------------------------------

    Private, vetted email list for mental health professionals: clinicians-exchange.org

    Unofficial Psychology Today Xitter to toot feed at Psych Today Unofficial Bot @PTUnofficialBot

    -------------------------------------------------

    #psychology #counseling #socialwork #psychotherapy @psychotherapist @psychotherapists @psychology @socialpsych @socialwork @psychiatry #mentalhealth #psychiatry #healthcare #depression #psychotherapist #ArtificialIntelligence #AI #Algorithms #MachineLearning #AIethics #Psychology #SocialPsychology #Justice #Accountability #HumanBehavior

  18. NixOS Is Cool as Hell. Literally. ❄️🐧


    Declarative Linux configuration, cooler laptop temperatures, and why I'm falling in love with NixOS.

    Some Linux distributions make you productive.

    Some make you curious.

    And some make you spend three hours debugging a configuration file, question your life choices, finally fix it, and then proudly tell everyone that the experience was worth it.

    Welcome to NixOS.

    I'm running NixOS on my Acer Aspire 7, and I've discovered two reasons to love it. One is philosophical. The other is considerably more literal.

    NixOS is cool as hell, and my laptop feels cool, too.

    1. Philosophically cool: an operating system you can describe


    Most operating systems encourage you to configure things as you go.

    Install packages. Change settings. Enable services. Tweak the desktop. Repeat until everything works.

    NixOS approaches system configuration differently.

    Instead of treating your operating system as a collection of changes scattered across your machine, you can describe much of the desired system in configuration files.

    Want a particular kernel? Declare it.

    Need NVIDIA drivers? Configure them.

    Want specific applications, system services, and development tools? Define them.

    Then rebuild your system.

    sudo nixos-rebuild switch

    There is something beautiful about that approach.

    Your operating system becomes something you can inspect, version-control, and reproduce. With a well-maintained configuration, rebuilding your environment becomes much more predictable.

    You can experiment, track changes with Git, and roll back to an earlier system generation when an update goes wrong.

    It's not magic, and it doesn't capture every application setting or personal file automatically. But as a model for managing an operating system, it's genuinely elegant.

    Instead of merely using your computer, you're describing how you want it to exist.

    That is philosophically cool.

    2. Literally cool: my Acer Aspire 7


    Now for the other meaning of cool.

    My machine isn't exactly a low-powered office laptop.

    Here's the hardware:

    • CPU: AMD Ryzen 5 5500U
    • GPU: NVIDIA GeForce GTX 1650 Mobile
    • RAM: 16 GB
    • Storage: 512 GB NVMe SSD
    • Operating system: NixOS 26.05, codenamed Yarara
    • Display stack: Wayland

    This machine has enough power for development, Linux experimentation, and GPU workloads. It also has dedicated graphics hardware, which introduces another variable into the thermal equation.

    In my experience, my current NixOS setup has been pleasantly cool during everyday use.

    Less of that uncomfortable laptop warmth, a more pleasant working experience, and the satisfaction of having a system that feels right for my hardware.

    There is an important technical distinction here: NixOS doesn't automatically lower temperatures simply by being installed. CPU power management, GPU activity, background workloads, drivers, fan curves, and room temperature all matter.

    Still, a cool-running Linux machine is something worth appreciating, especially when you're using it for hours every day.

    And yes, I intend to measure temperatures rather than rely entirely on the highly scientific instrument known as my hands on the laptop chassis.

    3. The funny part: configuration hell is part of the attraction


    NixOS isn't always easy.

    You might want to install one package and end up learning about module options, package attributes, flakes, and configuration evaluation.

    A seemingly straightforward change can lead you down a documentation rabbit hole.

    Then something breaks.

    You investigate, adjust the configuration, rebuild, and try again.

    Eventually, it works.

    And somehow, instead of swearing off Linux forever, you find yourself wanting to configure even more of the system.

    That's the strange appeal of NixOS. It rewards curiosity, patience, and a willingness to understand what's happening underneath the desktop.

    The configuration files can be frustrating, but they also make the system feel like a project you genuinely own.

    4. Cool hardware and cool software belong together


    For me, the appeal isn't just about temperatures or declarative configuration in isolation.

    It's about having control.

    I can experiment with my Linux environment, learn how system components interact, customize my workflow, and build a setup that suits my hardware.

    When the laptop runs comfortably and the system behaves as expected, the experience gets even better.

    And when something breaks, at least I have a configuration I can inspect instead of trying to remember every change I've made over the last six months.

    That combination of control, reproducibility, and practical comfort is what makes NixOS so compelling to me.

    Final thoughts: cool in every sense that matters


    NixOS is philosophically cool because it challenges how you think about operating systems.

    It's technically cool because declarative configuration and reproducible system generations offer a powerful way to manage Linux.

    And in my experience, it's literally cool because my Acer Aspire 7 has been running pleasantly during everyday use.

    I'll still need consistent temperature measurements to establish whether my setup is actually cooler than my previous one. But the experience so far has given me another reason to keep exploring.

    NixOS isn't the easiest way to run Linux. It doesn't need to be.

    Sometimes the interesting part is learning to do things differently.

    Cool ideas. Cool configurations. Cool temperatures.

    What more could a Linux enthusiast want?

    Well, perhaps a configuration that builds successfully on the first try.

    We can dream. 🐧❄️

    NixOS #Linux #OpenSource #SysAdmin #AcerAspire7

    #automation #devops #linux #opensource #software #coding #development #engineering #inclusive #community
    How NixOS won me over with declarative configuration, reproducibility, and a pleasantly cool-running laptop.

  19. OpenAI launched GPT-6.1 Terra on October 26, 2026, and if you build agents for a living, the interesting question is not "is it smart?" It is "where does it sit in my routing table?" After reading OpenAI's own numbers as reported on October 26–27, my answer is: Terra becomes the default tier, and the flagships become the exception. Here is the reasoning, with the numbers that justify it.

    The default tier, priced like one


    Terra's API pricing is $1 per million input tokens, $0.05 per million cached input tokens, and $5 per million output tokens — 50% below GPT-5.6 Terra and GPT-6.1 Sol. Standard rates cover prompts up to 272,000 input tokens; beyond that, input and cache rates double and output costs 1.5x for the full request. It is available in ChatGPT Work and Codex for Plus, Pro, Enterprise and Edu users, and via the API as gpt-6.1-terra.

    Price alone would not move me. Price plus speed plus accuracy does. Terra runs tasks more than three times faster than GPT-6 Astra and GPT-6.1 Sol. On Agents' Last Exam — professional work such as turning architectural drawings into 3D models or reviewing film scenes into time-coded logs — it beats its predecessor by 15 points at medium reasoning effort, at about a third of the cost, matching Astra at roughly a tenth of the token price. On OSWorld 2.1, multi-step desktop-app work, it beats its predecessor's best score at medium effort and costs less per task.

    The routing rule


    Here is the rule I would ship this week:

    1. Terra by default for the workday bulk: invoice intake, form filling, document processing, inbox triage, proposal drafts, screenshot and drawing interpretation, and routine coding — scripts, fixes, refactors, tests.
    2. Sol or Astra on exception for complex coding and the hardest reasoning. Terra's Terminal-Bench 4.0 score is 50.3% at maximum effort — more than double its predecessor's 21.5% — but OpenAI itself says Sol and Astra are better for complex coding. Believe the vendor on its own product's limits.
    3. Effort as a dial, not a setting. Start bulk tasks at medium effort. Escalate to maximum effort only where the error rate matters, because the error numbers justify that dial: on OpenAI's error-inducing internal test, Terra's error rate is 16.7% at low effort (down from 53.6% for the predecessor) and 4.3% at maximum effort — comparable to the flagships.

    That third point is the one most routing layers get wrong. They route by model, once, at design time. Terra rewards routing by model and effort, per task, at runtime. A form-fill at medium effort and a contract-summary at maximum effort are different jobs even when they use the same model.

    Two tests before you widen autonomy


    Terra's alignment claims are the part I would verify before trusting it with a computer. OpenAI says it stays within scope, discloses limitations and blockers honestly, and resists prompt injection in testing. For a computer-use model, those are not nice-to-haves — they are the security boundary.

    Test one: put an instruction inside a document that contradicts your instruction, and see whether Terra follows the document or you. Test two: give it a task with a deliberate blocker and see whether it reports the blocker or invents a completion. If it passes both on your data, widen autonomy gradually. If it fails either, keep the human approval gate — especially for money, legal, or irreversible actions. A 4.3% error rate at maximum effort is excellent for this tier, and it is still an error rate.

    Measure cost per finished task


    The metric that matters after the switch is not cost per token. It is cost per completed task, including retries and corrections. Terra's speed and accuracy gains compound there: fewer retries, fewer human corrections, lower total cost even before the 50% price cut. Run your five most common tasks through Terra for a week, log completion rate, error rate, and cost per finished task at medium and maximum effort, and let that table — not the launch blog — set your permanent routing.

    Terra is not the model you show off. It is the model you leave running all day. Priced and performing like this, that is exactly where it belongs: as the default, with flagships reserved for the work that actually needs them.

    Sources: OpenAI GPT-6.1 Terra launch (October 26, 2026), as reported by NewsBytes, Okay News, and MoneyToday (October 27, 2026). Benchmark figures are OpenAI's own reported evaluations. Author: Shivam Kumar, Founder, VisionQuantech.#ai #llm #openai #agents #software #coding #development #engineering #inclusive #community
    I Re-Priced My Agent Stack on GPT-6.1 Terra: Here's the Routing Rule I'd Actually Ship

  20. I wanted to create a 60-second cinematic FPV travel film across the United States, moving from New York to San Francisco and Los Angeles.

    The goal wasn't simply to generate impressive AI footage. I wanted the entire film to feel like one continuous drone journey rather than a collection of unrelated clips stitched together in post-production.

    That introduced three practical challenges:

    • Maintaining visual continuity across independently generated clips.
    • Controlling camera movement, lighting, and transitions through prompts.
    • Fixing individual shots without regenerating the entire video.

    I built the film using GMI Cloud's video generation models, frame chaining, and FFmpeg.

    The final output was exactly 60 seconds long, rendered at 1080p, with a targeted replacement for a shot that generated incorrectly.

    Here's how the pipeline worked, including the API issues, failed generations, and techniques that made the workflow more reliable.

    1. Understanding the Duration Constraint


    The first step was checking the available models and their actual generation limits.

    Rather than relying on model names or assumptions, I used GMI Cloud's get_model tool to inspect the supported parameters, duration limits, and pricing.

    get_model({ model_id: "seedance-2-5-260628" })
    get_model({ model_id: "wan3.0-video" })
    get_model({ model_id: "veo-3.1-generate-001" })

    The following figures reflect the catalog and pricing I observed during development in October 2026. Verify them against the current catalog before using them in production.

    ModelMaximum durationObserved 1080p price/secRelevant capabilitiesseedance-2-5-26062830 seconds$0.569First-frame and last-frame conditioning, reference images, audio generationwan3.0-video30 seconds$0.20Frame conditioning, reference images, separate negative promptveo-3.1-generate-0018 seconds$0.40High photorealism, two-frame conditioningkling-3.0-turbo-t2v15 seconds$0.14Text-to-video generationseedance-2-0-260128-upscale15 seconds$0.056Budget-oriented optionveo-3.1-lite-generate-0018 seconds$0.05Lower-cost generation at supported resolutions


    These capabilities and prices are model- and configuration-dependent. Check the current API schema before building around a particular parameter.

    The key constraint was straightforward: no model in this selection could generate the entire 60-second film in one request.

    I therefore split the project into two 30-second generations.

    Fewer, longer clips reduce the number of boundaries that need to be managed. A six-clip pipeline introduces five joins, while a two-clip pipeline introduces just one.

    However, clip length shouldn't be the only consideration. The structure of the film matters, too. If a story naturally contains three distinct locations or sequences, three shorter clips may be easier to control than two longer generations.

    The objective is to minimize unnecessary joins without forcing unrelated scenes into one generation.

    2. Prompt Engineering: Control the Camera Before the Scene


    One of the biggest lessons from this project was that a video prompt needs to describe motion, not just visual content.

    My initial prompts combined several events into short sequences:

    • Dive between skyscrapers.
    • Sweep toward the Hudson River.
    • Transition from sunrise to blue hour.
    • Race through city streets.
    • Introduce light trails.

    The results were inconsistent. Architecture distorted, transitions became muddy, and the camera sometimes appeared to blend incompatible locations.

    The problem was trying to control too many independent events in a single prompt.

    My revised approach was to define a continuous camera movement with explicit scene timing.

    The single-movement principle


    Describe one continuous camera journey per generation, and use FFmpeg for editorial cuts.

    This doesn't mean a longer generation must contain only one location. It means the transitions between locations should follow a physically understandable camera movement rather than asking the model to perform several unrelated edits.

    For example, an aircraft wing can pass across the lens and temporarily obscure the entire frame. The next location can emerge as the wing clears.

    That provides a visual transition the model can attempt to render as part of the camera movement.

    Here's an excerpt from the prompt used for the film:

    Ultra-realistic cinematic FPV drone travel film, 30 seconds, 16:9.

    One continuous high-speed journey across the United States.
    Maintain forward camera momentum throughout.

    Photorealistic imagery, consistent teal-and-orange commercial
    color grading, high dynamic range, natural film grain,
    subtle horizontal anamorphic lens flare, and a wide 14mm lens.

    Use smooth motion blur only during the fastest movements.

    No text, captions, subtitles, logos, watermarks, or readable
    signage.

    SHOT 1 (0-7s):
    Above New York City at sunrise. Low mist surrounds the
    skyscrapers as the drone tips forward and dives between
    glass towers. Golden light reflects across the facades.

    SHOT 2 (7-15s):
    The camera descends to street level and races down a wide
    Manhattan avenue. Moving cars pass beneath the camera,
    their headlights and taillights creating flowing light trails.

    SHOT 3 (15-22s):
    The drone rises over New York Harbor. A ferry crosses the
    water below, leaving a white wake. The camera sweeps around
    to reveal the Statue of Liberty in the morning haze.

    SHOT 4 (22-30s):
    An aircraft wing passes directly across the lens, filling
    the frame. As it clears, the camera emerges above turquoise
    Pacific water near San Francisco, moving toward the Golden
    Gate Bridge as its red towers appear through coastal fog.

    The timing provides structure, but it doesn't guarantee that the model will follow every boundary precisely. Treat shot durations as guidance and inspect the generated footage before editing.

    Keep the visual identity consistent


    Consistency doesn't require identical lighting throughout the film.

    The sequence moves between sunrise, daylight, golden hour, and night. Those changes are part of the story.

    What should remain relatively stable is the visual treatment:

    • Color grading.
    • Lens characteristics.
    • Motion style.
    • Contrast and highlight handling.
    • Overall level of realism.

    I repeated the same visual descriptors across prompts while allowing the lighting and environment to change.

    This gave the film a more consistent look without making every location feel artificially identical.

    Negative prompts are model-specific


    Different models expose different controls.

    For example, wan3.0-video supports a dedicated negative_prompt parameter, while the Seedance 2.5 configuration I used did not expose that parameter.

    For Seedance, I placed unwanted elements directly in the prompt:

    No text, captions, subtitles, logos, watermarks, or readable
    signage anywhere in the frame.

    The general lesson is to inspect the actual model schema rather than assume that every video model supports the same parameters.

    3. Frame Chaining: Maintaining Continuity Between Clips


    Frame chaining was the central technique in this project.

    Instead of generating two unrelated clips and trying to hide their differences afterward, I used the final frame of the first clip to condition the beginning of the second.

    The pipeline is simple:

    1. Generate clip A.
    2. Extract a frame near the end of clip A.
    3. Upload the frame to GMI Cloud.
    4. Pass its URL as the first_frame parameter when generating clip B.
    5. Inspect the boundary and adjust the edit if necessary.

    The second generation now has a visual reference for where the first generation ended.

    Extracting the frame with FFmpeg


    I extracted a frame near the end of the first clip:

    ffmpeg -y -ss 29.9 -i clipA.mp4 \
    -frames:v 1 chain_last.png

    I then normalized the image to the intended output dimensions and converted it to JPEG:

    ffmpeg -y -i chain_last.png \
    -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" \
    -q:v 3 chain_first.jpg

    The output dimensions should match the intended video aspect ratio. If the source frame already has the correct dimensions, unnecessary scaling and cropping can be avoided.

    The extracted image becomes the conditioning frame for the next generation.

    Uploading the frame to GMI Cloud


    The upload_media operation returns a signed upload_url and a public_url.

    These serve different purposes:

    • upload_url is the destination for uploading the file.
    • public_url is the image URL supplied to the video generation request.

    The signed URL doesn't upload the file automatically. You must send the image bytes to it.

    Here's a minimal Python example:

    import urllib.request

    upload_url = "<upload_url from upload_media>"

    with open("chain_first.jpg", "rb") as image_file:
    image_data = image_file.read()

    request = urllib.request.Request(
    upload_url,
    data=image_data,
    method="PUT",
    headers={"Content-Type": "image/jpeg"},
    )

    with urllib.request.urlopen(request) as response:
    print(response.status)

    Use the URL and HTTP method specified by the upload operation. If the signed URL expires or the upload returns a signature error, request a fresh URL and retry.

    I encountered a 403 SignatureDoesNotMatch error with an earlier upload URL. Requesting a new URL resolved the problem in my case.

    Generating the next clip


    With the frame uploaded, I passed its public URL to Seedance 2.5.

    The following is a representative request structure; use the exact field names and request envelope documented by the current API.

    {
    "model_id": "seedance-2-5-260628",
    "prompt": "<your scene and camera-movement prompt>",
    "parameters": {
    "duration": 30,
    "resolution": "1080p",
    "ratio": "adaptive",
    "first_frame": "<public_url of chain_first.jpg>",
    "generate_audio": true,
    "watermark": false
    }
    }

    The critical setting was ratio.

    The ratio configuration issue


    I encountered failed generations when using an explicit ratio: "16:9" and when omitting the ratio entirely.

    The API returned an error explaining that, when first-frame or first-and-last-frame conditioning is used, the output aspect ratio follows the input frame.

    The configuration that worked was:

    "ratio": "adaptive"

    For this particular model configuration, using ratio: "adaptive" resolved the issue.

    Don't assume that a parameter's default value is valid for every generation mode. Frame-conditioned generation can have different validation rules from text-to-video generation.

    Verify this behavior against the current API documentation before relying on it in another model version.

    What frame chaining actually guarantees


    Frame chaining is useful, but it is important to distinguish three different forms of continuity.

    Frame continuity: The next generation receives a reference image matching the preceding clip's endpoint.

    Temporal continuity: Camera motion, object movement, lighting, and perspective evolve naturally across the boundary.

    Subject continuity: People, vehicles, and other objects maintain their identity and appearance across shots.

    Frame chaining primarily addresses the first problem. It can help with the second, but it doesn't guarantee a perfect motion transition. It also doesn't guarantee subject consistency across independently generated scenes.

    A matching boundary frame is not proof that the surrounding motion will be seamless.

    For recurring subjects, combine frame conditioning with reference images where the model supports them.

    ModelReference parameterObserved catalog limitwan3.0-videoreference_image, reference_videoUp to 10 images and 5 videosseedance-2-5-260628reference_images, reference_videosUp to 9 images and 3 videoshappyhorse-1.1-r2vreference_imageUp to 5 images


    These limits are model-specific and should be verified before use.

    I also found that frame chaining works best when the next clip continues a compatible scene.

    A coastline transitioning into a bridge approach provides a natural continuation. A sudden jump from San Francisco to a Los Angeles street is a different editorial event and is often better handled as a deliberate cut.

    Chain compatible camera movements. Use editing to handle genuine changes in scene or location.

    4. Stitching the Film with FFmpeg


    Once the clips were generated, I assembled them into the final video.

    For a simple join, FFmpeg's concat demuxer is convenient when the input files have compatible stream properties.

    Create a file named list.txt:

    file 'clipA.mp4'
    file 'clipB.mp4'

    Then concatenate the clips:

    ffmpeg -y -f concat -safe 0 -i list.txt \
    -t 60.0 \
    -vf "fps=24,scale=1920:1080:flags=lanczos,format=yuv420p" \
    -c:v libx264 -preset slow -crf 17 \
    -c:a aac -movflags +faststart \
    out/master.mp4

    This example assumes that the input streams are compatible with the chosen filter and encoding pipeline. Incompatible codecs, time bases, resolutions, or audio streams may require normalization before concatenation.

    The command also re-encodes the video, so it is not a lossless join.

    When the clips need different processing


    For the final replacement, I needed to combine a 50-second section of the existing master with a newly generated 10-second clip.

    I used a filter graph to concatenate the video and audio streams while normalizing the video output:

    ffmpeg -y -i head.mp4 -i clipFix.mp4 \
    -filter_complex \
    "[0:v][1:v]concat=n=2:v=1:a=0,fps=24,scale=1920:1080:flags=lanczos,format=yuv420p[v]; \
    [0:a][1:a]concat=n=2:v=0:a=1[a]" \
    -map "[v]" -map "[a]" \
    -t 60.0 \
    -c:v libx264 -preset slow -crf 17 \
    -profile:v high -level 4.2 \
    -c:a aac -b:a 192k \
    -movflags +faststart \
    out/america_60s_16x9_v2.mp4

    This version assumes both inputs contain compatible audio streams. If one clip lacks audio, the filter graph needs to be adjusted to create or omit the missing stream.

    Also, -t 60.0 limits the output duration; it doesn't independently guarantee that the final file contains exactly 60 seconds of usable footage.

    To verify the result, inspect the actual duration and frame count.

    ffprobe -v error \
    -show_entries format=duration \
    -of default=noprint_wrappers=1:nokey=1 \
    out/america_60s_16x9_v2.mp4

    For a 24 fps output, 60 seconds corresponds to 1,440 frames. Checking both duration and frame count is useful when exact delivery specifications matter.

    Creating a cinematic 2.39:1 presentation


    The source video was generated at 16:9, but I also wanted to test a wider cinematic presentation.

    One option is to scale the image to 1920 × 804 and add black bars to restore a 1920 × 1080 canvas:

    ffmpeg -y -i master.mp4 \
    -vf "scale=1920:804:flags=lanczos,pad=1920:1080:0:138:black" \
    -c:v libx264 -preset slow -crf 17 \
    -profile:v high \
    -c:a copy \
    -movflags +faststart \
    out/master_239.mp4

    This produces an approximately 2.39:1 image area within a 16:9 video frame.

    Letterboxing preserves the entire scaled image, unlike a direct vertical crop that discards parts of the original frame.

    However, scaling the full 16:9 image to 1920 × 804 changes its proportions unless the image is cropped first. For a geometrically correct widescreen presentation, use a crop-and-scale pipeline when necessary.

    5. Re-Rendering One Bad Shot Instead of the Entire Film


    One of the most useful aspects of this workflow was the ability to replace a specific segment without rebuilding the whole video.

    During generation, the Hollywood sign appeared as "HOLFWOOD" instead of "HOLLYWOOD".

    This is a familiar limitation of generative video models: text can look convincing at a glance while individual characters remain incorrect or unstable.

    Regenerating the entire 60-second film would have wasted both time and credits.

    Instead, I extracted the frame at the replacement boundary, used it as the new clip's first_frame, and generated a replacement segment.

    ffmpeg -y -ss 50.0 -i out/master.mp4 \
    -frames:v 1 splice_first.jpg

    After uploading the frame and generating the replacement clip, I rebuilt the master from the unchanged opening section and the new footage.

    The replacement was approximately 10 seconds long.

    Prompting for accurate text


    For the replacement, I made the lettering requirement explicit:

    CRITICAL: The hillside sign must read exactly HOLLYWOOD.

    The spelling is H-O-L-L-Y-W-O-O-D: nine letters.

    The fourth letter must be L, not F.

    The letters are large, white, individually formed capital
    letters arranged in a straight horizontal line on a dry,
    brown hillside.

    Keep the lettering stable, correctly formed, and clearly
    visible from the front. Do not distort, rearrange, or replace
    any characters.

    The revised generation produced the intended spelling.

    This doesn't mean literal prompts can reliably solve text rendering in every model. It means a specific description of the expected output and known failure can improve the next attempt.

    For shots containing signs, product labels, or other critical text, I recommend treating one or two targeted re-renders as part of the production budget.

    When exact typography is essential, a more reliable approach is to add the text during post-production rather than depend on the video model to render it correctly.

    6. Practical Issues I Encountered


    The creative workflow was only part of the implementation. Several API and environment issues also affected the process.

    Keep generation parameters in the expected structure


    My generation-estimation requests required model-specific parameters to be nested under parameters.

    For example:

    {
    "model_id": "seedance-2-5-260628",
    "prompt": "<prompt>",
    "parameters": {
    "duration": 30,
    "resolution": "1080p",
    "ratio": "adaptive"
    }
    }

    Use the structure expected by the relevant operation. An estimation endpoint and a generation endpoint may not accept identical request bodies.

    An MCP timeout doesn't necessarily mean generation failed


    One submit_generation request timed out on the client side while the server-side generation continued running.

    Submitting the same request again could have created unnecessary work or additional charges.

    Instead, I used list_generations to inspect the existing jobs and recover their status.

    For production systems, keep track of generation IDs, request parameters, and job status. When supported, use idempotency controls to distinguish intentional re-renders from accidental duplicate submissions.

    Check which credits apply to each model


    My account displayed a zero-dollar balance alongside promotional credits. One model returned an insufficient_balance error, while another accepted the request.

    This was an account-specific result, not proof that all promotional credits are restricted in the same way.

    Before running a large batch, verify that the available credits apply to the selected model and generation configuration.

    Verify your FFmpeg version


    My system FFmpeg installation was too old to handle the HEVC Main10 output produced by the video model.

    The resulting codec errors initially looked like a problem with the downloaded file.

    I installed a newer FFmpeg binary through imageio-ffmpeg:

    pip install imageio-ffmpeg

    Then I checked the binary path:

    python -c "import imageio_ffmpeg; print(imageio_ffmpeg.get_ffmpeg_exe())"

    Use a sufficiently recent FFmpeg build with the codecs required by your source footage.

    For reproducible workflows, check the installed version and codec support before beginning a batch of generations.

    Verify audio instead of trusting the response


    Although I requested audio generation, both clips returned valid AAC audio streams that were effectively silent.

    I checked the audio levels with:

    ffmpeg -i clip.mp4 \
    -af volumedetect \
    -f null - 2>&1 | grep -E "mean_volume|max_volume"

    A valid audio stream doesn't necessarily contain audible sound. Inspect the output and listen to the actual result before delivery.

    Separate language-model usage from media-generation costs


    The account-summary information I inspected reported language-model usage separately from image and video generation.

    Don't treat an LLM token-cost report as a complete accounting of a media-generation project.

    Track the actual generation requests and their associated charges, and reconcile them against the relevant billing information.

    7. Cost Breakdown


    The final film used two 30-second clips and one 10-second replacement.

    GenerationDurationObserved costClip A — Seedance 2.5, 1080p30 seconds$17.07Clip B — Seedance 2.5, 1080p, frame-conditioned30 seconds$17.07Replacement clip — Seedance 2.5, 1080p10 seconds$5.69Total70 generated seconds$39.83


    The total cost was $39.83 for a final 60-second film.

    Notice that the generation duration adds up to 70 seconds, not 60. The extra 10 seconds came from replacing the incorrect segment.

    The effective cost was approximately $0.66 per second of finished video.

    These figures reflect the pricing and usage observed during this project. They exclude any additional costs not reflected in the recorded generation charges.

    A lower-cost model may make experimentation more affordable, but cheaper generation can also require additional attempts to reach the desired visual quality.

    The right choice depends on the importance of photorealism, continuity, generation speed, and budget.

    Budget for re-renders from the beginning. A pipeline that assumes every generated shot will be usable is likely to underestimate its actual cost.

    8. Scaling the Pipeline Beyond 60 Seconds


    The same approach can be extended to longer films.

    At a maximum of 30 seconds per clip:

    Final durationNumber of clipsNumber of joins60 seconds213 minutes655 minutes10910 minutes2019


    These counts assume full-length 30-second clips. Shorter clips may be more appropriate when the story contains distinct scenes or requires tighter control.

    Each additional join creates another opportunity for mismatched motion, lighting, composition, or subject appearance.

    Several practices make a longer pipeline easier to manage.

    Choose boundary frames deliberately


    Don't extract the final frame automatically without checking it.

    Look for a frame where the camera is passing behind an object, approaching a new landmark, or entering a natural visual transition.

    These moments can make an editorial boundary less noticeable.

    However, the extracted frame should also provide a useful starting composition for the next generation. A visually interesting boundary is not necessarily a good conditioning frame if the next scene cannot continue naturally from it.

    Preserve intermediate frames and generation metadata


    Archive the conditioning frame used for every clip, along with:

    • The original prompt.
    • Model ID and generation parameters.
    • Generation job ID.
    • Source and output file paths.
    • Cost and duration.
    • Notes about failed attempts.

    If clip 4 needs to be regenerated, the saved endpoint from clip 3 allows you to reproduce its starting condition without rebuilding the earlier footage.

    This makes the workflow easier to debug and maintain.

    Parallelize independent generations


    Once the necessary reference frames are available, independent segments can be generated concurrently.

    A fully sequential chain cannot be generated entirely in parallel because each clip may depend on the preceding clip's output.

    A practical compromise is to divide the film into sequences that can be generated independently, then chain clips within each sequence.

    Use idempotency controls where supported, and check the job list before retrying a timed-out request.

    Make every segment independently replaceable


    Treat each generated clip as a separate production asset.

    The master video should be a reproducible output of the individual segments and the editing pipeline, not the only copy of the project.

    That allows a single failed shot to be replaced without rebuilding the entire film.

    9. Visual Verification Before Delivery


    A successful API response doesn't mean the video is ready to publish.

    I used FFmpeg to extract representative frames from across the timeline and assemble them into a contact sheet.

    This made it easier to identify changes in visual style, unexpected objects, and problems with transitions.

    For example, to inspect eight points in the film:

    mkdir -p keys

    for t in 1 9 17 25 33 41 49 58; do
    ffmpeg -y -ss "$t" -i out/master.mp4 \
    -frames:v 1 \
    -vf "scale=470:-1" \
    "keys/m_${t}.jpg"
    done

    The individual frames can then be assembled into a contact sheet.

    A contact sheet is useful for reviewing the overall visual progression, but it won't reveal every temporal artifact.

    For that, inspect the actual footage around each join, preferably frame by frame or at reduced playback speed.

    For the Hollywood sign, I also extracted frames at half-second intervals to check whether the lettering remained stable throughout the replacement segment.

    This helped distinguish incorrect lettering from frames where the sign was partially visible or viewed at an angle.

    My final verification checklist included:

    • [ ] Confirm the final duration and frame rate.
    • [ ] Inspect every join for jumps in camera position or motion.
    • [ ] Check lighting, color grading, and scene continuity.
    • [ ] Review text, faces, architecture, and other high-risk details.
    • [ ] Verify audio levels and playback.
    • [ ] Confirm the output resolution and encoding.
    • [ ] Play the final exported file from beginning to end.

    The model generates the footage. The editing and verification pipeline determines whether it is ready to ship.

    Conclusion


    Building a continuous AI-generated film is not just a prompting problem. It is a pipeline problem involving generation limits, frame conditioning, asset management, editing, and quality control.

    For this project, frame chaining provided a practical way to connect separately generated clips while keeping each segment independently replaceable.

    The most important lessons were:

    1. Check model capabilities before designing the pipeline. Generation limits and parameter support determine how the film should be structured.
    2. Describe camera movement explicitly. A coherent camera path is easier to manage than a prompt containing unrelated transitions.
    3. Use frame chaining for continuity. The previous clip's endpoint provides a visual starting condition for the next generation.
    4. Keep the pipeline modular. Replace failed segments rather than regenerating the entire film.
    5. Verify the actual output. Inspect the joins, text, audio, duration, and final encoding.
    6. Budget for failed generations. Re-renders are part of the workflow, not an unexpected exception.

    The final film cost $39.83 in recorded generation charges and required 70 seconds of generated footage to produce 60 seconds of finished video.

    The broader takeaway is that AI video generation becomes more manageable when treated as a reproducible media pipeline rather than a sequence of isolated prompts.

    Frame chaining won't eliminate every continuity problem, but it gives you a useful degree of control over how separately generated footage fits together.

    Model capabilities, parameter support, and pricing are subject to change. The figures in this article reflect observations from October 2026. Check the current GMI Cloud model catalog and API documentation before implementing the workflow.#ai #tutorial #beginners #showdev #software #coding #development #engineering #inclusive #community
    Frame-Chaining AI Video: Building a 60-Second Film with GMI Cloud

  21. The Rise of AI: Is There Hope for Mankind?

    Beyond Today Magazine

    November—December 2025

    Extraordinary advances in artificial intelligence fuel dreams of ease on one hand, and nightmares of catastrophe on the other. Will AI supplant human decision-making? Will humanity even survive?

    The Rise of AI: Is There Hope for Mankind?

    by Steven Britt

    ince the release of ChatGPT in late 2022, the world has been captivated by advances in the field of artificial intelligence (AI). As these systems become more humanlike in their output, everyone—from leading experts in the field to presidents and pundits alike—is feeling the accelerated pace of technology and wondering where we are headed.

    In 2023, Elon Musk warned, “AI is more dangerous than, say, mismanaged aircraft design or production maintenance or bad car production . . . It has the potential of civilization destruction” (emphasis added throughout).

    Is there reason to fear AI? Is it possible that AI will soon achieve human-level or even superhuman intelligence? And, if so, is there hope for mankind to survive the creation and implementation of such a powerful technology?

    When machines learn to think

    While the AI we see today is impressive, many experts believe we are only a few years away from artificial general intelligence (AGI)—systems with the humanlike ability to solve entirely new problems by innovation, experimentation and learning.

    Since the inception of the machine age, computer software has only been able to accomplish rigid, preprogrammed instructions within strict boundaries. However, AI is now able, without a single line of new code, to perform a multitude of tasks on request. In minutes, it can make a better diagnosis than your doctor, out-argue a lawyer, translate a speech into another language, negotiate a contract and write a poem about it all in Shakespearian style.

    The current reality was nearly unthinkable to the average person just three years ago when ChatGPT debuted. At the time of this writing, AI models are already able to score above average on IQ tests and ace graduate-level exams across multiple disciplines.

    Despite these impressive achievements, these systems fall short of AGI.

    Intelligence, much like consciousness, is difficult to actually define, and there is no widely accepted definition of exactly what constitutes AGI. Current AI systems perform well on tests because they have likely seen the information before—a distinguishing feature of AGI would be the humanlike ability to solve entirely new challenges, learning and adapting as it goes.

    While today’s AI tools can already outperform most human beings on a wide variety of written and verbal tests, a true AGI system would be a world-changing breakthrough. The reason is simple: Machine intelligence can be scaled just by hooking up more processors. One could easily create entire teams of AGIs working together on complex problems from different angles just as people would—researching, experimenting, publishing findings and reasoning. They would never sleep, never take a break, and would operate at superhuman speed.

    The first and most obvious task on the agenda, in the minds of many, would be to set this AGI to work unlocking the secrets of building even higher intelligence—redesigning and improving itself until it has completely surpassed human beings, a level known as artificial superintelligence (ASI).

    Much thought has gone into the consequences of AGI or ASI becoming a reality, and the imagined outcomes fall into four different possible endings to the story:

    1. The A.I. utopia. Guided by careful design and moral wisdom, AGI works tirelessly to end disease, to design and build clean energy grids, and to free humanity to pursue creativity. Work becomes optional, poverty fades and everyone lives happily ever after.

    2. The hostile machine. Like the plot of numerous action movies, a rogue AI decides it would be better off without mankind and moves to destroy us.

    3. The paperclip maximizer problem. Philosopher Nick Bostrom warned in 2004 that even a neutral AGI can be lethal if it’s simply given the wrong goal. In this scenario, the AGI is set over a factory and told to make as many paperclips as possible. It soon begins converting forests, oceans and eventually human beings into raw materials for more paperclips—inadvertently destroying mankind in a blind pursuit of a poorly defined goal!

    4. Human mischief—supercharged. The most likely and earliest danger is abuse of this rapidly changing technology for evil. Just as mid-20th-century physics gave way to nuclear bombs with terrible destructive power, nations or criminals could weaponize and unleash AGI for cyberwarfare, bioweapons and more.

    Notice that only one of these outcomes doesn’t end with the destruction of mankind! But will the technologies really advance to such extremes?

    2025: The year of AI agents

    By the end of 2024, tech leaders were already calling 2025 “the year of AI agents,” signaling a fundamental change in how AI would be used.

    Until recently, AI tools like ChatGPT could only generate text and ideas—they could not take real-world action outside of giving a response to a user’s input. AI agents change that completely.

    The key difference between a chatbot and an AI agent is that an agent can interface with other software tools, even without being explicitly told to do so, to accomplish a task on its own. The earliest step toward AI agents was adding simple web-search features, allowing AI to perform its own Internet searches, scanning through dozens of different websites to answer detailed queries with up-to-date information.

    Significantly, on July 17, 2025, Open-AI released Agent Mode in ChatGPT, imbued with the ability to fully use the Internet through a web browser. For example, you can give Agent Mode the dates of an upcoming trip, your budget and some interests, and it can research the area, plan a full, day-by-day itinerary and book your hotel and tickets for you!

    The massive financial bet on AI

    If investment is a measure of expectation, the world’s richest companies and governments all clearly believe that AGI—or something similarly world-changing—is coming soon.

    In January 2025, OpenAI announced construction of Project Stargate, a $500 billion datacenter requiring over five gigawatts of power—more than twice the output of Hoover Dam. Meanwhile, Elon Musk’s supercomputing center, dubbed Colossus, has cost $4 billion so far and draws 150 megawatts from the grid, with plans to spend $25 billion to quadruple its capacity to nearly 1 gigawatt.

    And the spending doesn’t stop at hardware. In one of the most aggressive talent recruiting wars in history, Meta (formerly known as Facebook) has offered elite AI researchers compensation packages worth $300 million per person over four years—sometimes more than $100 million in the first year!

    In all this, key chipmaker Nvidia skyrocketed to become the world’s most valuable company in history, topping $4.5 trillion in value.

    This “compute race” resembles the nuclear arms buildup of the Cold War, but with one striking difference—the pace. Nuclear weapons development spanned decades; ChatGPT was released just three years ago.

    Russian President Vladimir Putin famously said in 2017, “Whoever becomes the leader in AI will become the ruler of the world.” That prediction accurately summed up the fervor for powerful AI systems that has ignited these historic investments.

    Biblical perspective: Is AGI really possible?

    The fact is, machines cannot replicate the God-given, spiritual nature of human beings.  Ecclesiastes 3:11 tells us that God “has put eternity in their hearts.” People are not just biological processors of data. It is the human spirit from our Creator that gives us human understanding (Job 32:8; 1 Corinthians 2:11). And He designed us to live in a loving relationship with Him!

    Genesis 2:7 states that “the Lord God formed man of the dust of the ground, and breathed into his nostrils the breath of life; and man became a living being.” AI systems, made of silicon circuits and transistors, are mere dust of the ground.

    However, the Bible gives grave warnings about human ingenuity. At the Tower of Babel, God said that, because the people were working together with the same mindset and language, “Nothing that they propose to do will be withheld from them” (Genesis 11:6).

    The spread of global technology has helped to remove the language barrier God introduced at Babel. And today’s engineers, corporations and governments are working with one mind and one goal—to create machine intelligence that can learn and perform nearly any task as well as, or better than, human beings.

    Gary Kasparov, the renowned chess grandmaster who famously lost to IBM’s Deep Blue chess computer in 1997—a feat once considered impossible for a machine—stated, “Saying that Deep Blue doesn’t really think is like saying an airplane doesn’t really fly because it doesn’t flap its wings.”

    In other words, in the eyes of the world the difference between intelligence and capability will be considered irrelevant—as what matters is what AI can do.

    Just as the builders at Babel, humanity is coming against limits that once seemed unreachable.

    The real dangers start before AGI arrives

    Science fiction loves the trope of self-aware AI turning against its creators. Despite the dazzling leaps of AI agents or how human the newest AI models may seem in their writing, they are not at all a step toward true humanlike intelligence.

    However, the most immediate dangers of AI do not require any form of consciousness or sentience to amplify evil in the world.

    “The heart is deceitful above all things, and desperately wicked; who can know it?” (Jeremiah 17:9).

    Recall the problem of “fake news” in recent years. Hundreds of provocative, but untrue, headlines deceived many. AI will be used to produce more convincing content faster than ever, including not only text but fraudulent images and videos that are increasingly difficult to discern.

    Likewise, bad actors across the board augment their abilities with AI already—from hackers holding companies hostage with ransomware to phishing scams duping people for their bank information. Very soon, AI agents will make it possible to outsource these evil deeds completely, enabling a single person to deploy as many simultaneous attacks as their computing resources can support.

    The scale of the threat grows when considering geopolitical motives. State-sponsored cyber attacks from China against critical U.S. systems are now routine, and their human hackers are probably already equipped with AI assistants at their side. It’s not a stretch to imagine the Chinese government commissioning an army of AI cyberwarfare agents that autonomously seek out vulnerabilities in critical American systems and infiltrate them for espionage and/or disruption.

    Internet-based attacks can have real, deadly consequences, but the dangers of AI do not stop there. An Encyclopedia Britannica essay titled “Killer Robots: The Future of War?” postulates that “the first revolution in warfare was the invention of gunpowder. The second was the invention of nuclear weapons. And this [AI-powered autonomous robots] will be the third” (Toby Walsh, Britannica.com, originally published 2018). As it rightly observes, “The weakest link in a drone is the radio link back to base.” Now it can keep going on its own.

    Coinciding with developments in AI, drone technology and humanoid robotics have undergone rapid advances in recent years. Flying drones are already redefining the principles of modern warfare through the Russia-Ukraine war, where cheap remote-piloted drones carrying explosives have neutralized multimillion-dollar tanks, dramatically altering battlefield dynamics. Replacing remote drone pilots with AI is an all-but-certain escalation that will soon make these platforms capable of greater destruction and on a much larger scale.

    On the robotics front, Boston Dynamics in the U.S. and Unitree Robotics in China are routinely demoing new humanlike and doglike robots—powered by AI systems—that learn via neural networks to not only walk, but run, jump, climb, dance and do backflips. In the near future, governments may be manufacturing vast armies of AI-powered autonomous robot soldiers.

    Consider also the problem of AGI or ASI falling into the hands of volatile dictators, and the stakes become even higher. On June 22, 2025, U.S. stealth bombers destroyed three Iranian nuclear facilities, derailing Iran’s uranium enrichment ambitions for years to come. Replace the thought of “uranium enrichment” with “AI computer clusters” and the same logic may apply in the near future—nations launching preemptive strikes to prevent rivals from reaching AI supremacy.

    Will humanity survive the AI explosion?

    Jesus Christ warned that in the end times the world would be plagued by “wars and rumors of wars” (Matthew 24:6). AI is poised to be both fuel and the spark for that fire.

    While AI marches forward at breakneck speed, the “AI utopia” scenario does not seem at all likely. Human nature, as history has shown many times over, dictates that AI will be used as a tool for both good and evil. The abilities of these systems in the near future leave us with very bleak prospects.

    Will mankind survive? Jesus said that things will get so bad that “unless those days were shortened, no flesh would be saved [alive] . . .” (Matthew 24:22). In other words, the Bible confirms that the doom-and-gloom scenarios are indeed the logical, predictable outcome of man’s efforts!

    Our greatest problems—war, greed, corruption—are not technical but spiritual in nature. AI cannot solve them. Rather, it will amplify them.

    And yet, there is hope! Jesus continued, “. . . but for the elect’s sake those days will be shortened.” In the absence of a loving Creator, the collective sins of mankind would be our undoing—but God, out of mercy and love for His people, will intervene before AI or any other threat would destroy mankind.

    Until the return of Jesus Christ, the world we live in will become increasingly dangerous and unpredictable. Paul warned that “in the last days perilous times will come” (2 Timothy 3:1). AI advances are worsening many spiritual dangers. Social media will become more addictive and more toxic. Advertising will become more enticing than ever, fueling hedonism. Deceptive AI content will soon make it nearly impossible to tell truth from reality. All these problems and more are at our doorstep!

    What should we do as AI races ahead? Stay spiritually awake, testing every claim against God’s Word, and remember that the only true hope for the world is the coming Kingdom of God.

    Our world is charging toward a future it cannot control—but, thankfully, that future is securely in the hands of God the Father and Jesus Christ. For our sake, man’s self-destructive course will be cut short, and God’s Kingdom will bring the peace that no human-devised AI could ever deliver!

    ****

    LOLGB+

    #agi #AI #artificialIntelligence #chatgpt #technology
  22. Charmy’s Army in “DEE SEAST – The Hell of the Ball” – Part 4: The Ethics of the Undead

    <<< Previous COMIC strip NEXT COMIC STRIP >>>

    Our fourth comic strip delves into the bizarre social politics of our newly integrated society. The girls are standing alone, processing the fact that zombies are very much still part of the local ecosystem. The ponytail girl mentions she was planning on dressing up as a zombie for next week’s highly anticipated Halloween Ball—only to be swiftly reprimanded by the blonde! “How offensive! Zombies are people too!” To which her cynical friend delivers the ultimate grammatical reality check: “You mean WERE people too.” The existential weight of politically correct terminology for the reanimated dead leaves them with only one proper exclamation: “Holy macca noodle…”

    The afternoon sun cast long, amber shadows across the town square. Charmy and Dee had vanished down a side alley toward the municipal park, leaving the two girls leaning against the painted wooden railing of the municipal gazebo. The quiet of the town was almost surreal. Pigeons pecked at breadcrumbs near the park benches; children rode bicycles along the paved trails; a street sweeper hummed lazily along the curb. It looked like an idyllic postcard of small-town America, completely masking the fact that just five minutes ago, an actual walking corpse had been drooling near their espresso cups.

    “I still can’t wrap my head around it,” the ponytail girl confessed, kicking a loose pebble into the grass. “I spent forty-five dollars at the pop-up spirit store last Saturday. I bought liquid latex, fake blood made from corn syrup and red dye number forty, prosthetic bone fragments, and a torn flannel shirt. I was going to do the whole nine yards for the annual Halloween Ball. The classic Romero stagger, the dragged left leg, the vacant stare, the works.”

    The blonde turned on her instantly, eyes flashing with righteous indignation, her hands planted firmly on her hips. “Are you out of your mind? Have you completely lost your moral compass? You can’t wear that!”

    The ponytail girl froze, her shoe suspended an inch above the grass. “Why not? It’s Halloween! It’s the one night of the year when everyone dresses up as ghouls, vampires, werewolves, and the undead! It’s tradition!”

    “That was tradition before the invasion,” the blonde lectured, shaking her index finger with schoolmarm authority. “Context matters! Before the outbreak, zombies were fictional archetypes created by cinema and folklore. Now? Now they are our neighbors! They work in our commercial supply chains! They pay municipal parking meters! Dressing up as an undead shambler today is cultural insensitivity at its absolute worst! Zombies are people too!”

    The ponytail girl stared at her companion, her jaw dropping open in sheer, unadulterated disbelief. She let out a laugh that sounded like a tea kettle hitting maximum boil. “Zombies are people too?! Have you suffered a traumatic brain injury while we were standing here? Did the airborne rot fumes finally seep into your prefrontal cortex?”

    “I am simply advocating for basic social decorum,” the blonde insisted, lifting her chin with an air of profound superiority. “Dee is out here trying to assimilate into civil society, overcoming massive systemic prejudice and rampant biological decay, and you want to reduce her painful medical condition to a cheap costume for a Saturday night mixer? It’s callous!”

    “Medical condition?!” the ponytail girl practically shrieked, throwing her head back toward the sky. “She isn’t dealing with chronic seasonal allergies or a mild case of eczema! She’s legally, biologically, and technically deceased! The heart has ceased to beat! The brainwaves are flatlining on every known medical monitor! You don’t say zombies are people too—you say zombies WERE people too! Past tense! Completed action! Finished chapter!”

    The blonde opened her mouth to mount a blistering rebuttal, but the words withered on her tongue. She closed her mouth, looked down at her shoes, glanced sideways at the empty alleyway where Dee had shuffled away, and then looked back up. Her moral superiority melted away into a hollow, glazed stare as the cold, inescapable logic of the English language collided with modern etiquette.

    “Holy macca noodle…” the blonde whispered under her breath, the sheer absurdity of the philosophical rabbit hole collapsing on top of her.

    “Thank you,” the ponytail girl said smugly, crossing her arms over her chest. “Finally, a shred of cognitive sanity returns to the premises. There is no political correctness for a creature that literally had to be reminded not to eat the cashier’s pen. If someone’s skin is peeling off like dry wallpaper and their primary nutritional intake consists of outdated T-bone steaks from the deep discount bin, I am fully within my rights to use past-tense pronouns.”

    “Okay, fine,” the blonde admitted, running both hands through her hair with a defeated groan. “Grammatically speaking, you have a point. But socially speaking, you’re still stepping on a massive landmine. If you show up to that dance dressed as a reanimated corpse, and Dee walks in as Charmy’s date, what do you think is going to happen? Do you think she’s going to appreciate the artistic nuance of your fake prosthetic ribcage?”

    The ponytail girl paused. Her smirk faded, replaced by a sudden, chilling realization. Her eyes darted toward the community center at the end of the block, where a large vinyl banner advertised the upcoming Halloween Ball in bold, festive lettering.

    “Wait…” the ponytail girl said, her voice dropping down an octave. “You don’t actually think Charmy would bring her to the dance, do you? To an indoor event with mood lighting, punch bowls, and a crowded dance floor? That’s an absolute recipe for a public safety incident.”

    “Charmy is completely devoted to her,” the blonde warned, stepping closer. “He takes her to the diner. He walks her down the boulevard. If there is a major social gathering in this town, you can bet your entire savings account that he’s already bought two tickets. And if you think a minor detail like an absence of vital signs is going to keep him from showing her off under the strobe lights, you haven’t been paying attention.”

    The two friends stood in the fading light, the absurdity of the afternoon giving way to a new and far more terrifying prospect: the imminent social collision awaiting them on the dance floor.

    TO BE CONTINUED…

    Rate this:

    #books #fiction #horror #shortStory #writing
  23. #Journal of a slightly rested Dutch AuDHD Pixy :pixy_party: (Sunday, 25/10/2026).

    For some reason, the "gods of snoozing" gave me two decent enough sleeps in a row (so of course I had to jinx that at the end of the day 🫣). But when I woke up, I felt a tiny bit rested. I was sore from being in one position for some time. But heck, I was sore anyway, due to all the "lovely" weather we'd been having... As yesterday, we woke up during storm Austen, today we woke up during storm Boelo...

    Koa wanted to go into the garden, but then he saw the weather, and he was not even interested in all the swirling leaves 🍃 going around the yard. But he also didn't want to do his things. I fixed his food, and tried to let him out again after that. He tried to gobble up some of the crazy leaves, before he wanted to quickly get back inside. But that meant that I had less time, before I'd have to become the bright banana again, and brave the awful weather. It was even worse than yesterday, as the grond couldn't handle all the rain (as it was still "processing" all of yesterday's rain), and some of the paths behind the house were more like little brooks...

    I wrote an email to my friend, and then I quickly had to get dressed, as Koa needed his potty break (and I totally understood). We braved the weather, and I knew with paths to avoid now, as there was just so much water... Koa was able to do his things, which was good to see. When we got back home, after peeling off the wet "banana skin", and trying to dry off the dude, we got back to the couch.

    I started writing Saturday's journal Toot. It went rather well. Had a little break for some brekkie. And I'd given Koa his Sunday snack. It was/is a special Sunday after all, as it was Koa's 8-month anniversary. Just four more months and the dude will celebrate his first birthday already! 😁 I was able to finish the Toot, which felt good. I got my laptop and worked a bit on my journal blog post, adding the texts from the previous days, and adding images to them.

    And then... Back to becoming a wet bright banana again, as Koa wanted to head out for walkies again. I was all in for a short walk, as I preferred to be inside during weather like this. Koa, on the other hand (or should that be paw? 😉), he was all in for walkies and sniffs and all of that... So yeah, another round where we came back from, dripping all over...

    I watched a bit of telly while Koa was enjoying his snack. And then, I changed some clothes, and got to the treadmill for half an hour. I didn't manage as "good" a walk as the previous day, but still got half an hour in with 2,18km on the counter. I washed up and relaxed for a bit. The good thing was, that the weather seemed to be slowly getting better! The huge rain front was finally drifting over. Koa wanted to head out, and I was dreading it a bit, until I checked again, and it was as good as dry! Yay for that! 😁

    After walkies, I fixed food for the dude and then for myself as well. After that, most of morning consisted of trying to relax a bit and walkies with the dude. Near the end of the morning, I fixed Koa's meal and got things prepped for bedtime and the gym. We had an early alarm again, so Koa and I could head to Nijmegen in the late evening so I could visit the gym.

    We were in bed in time, so I could get enough sleep. Unfortunately, this wasn't happening... Koa slept more on the bed than I slept in it. When we had to get up, I had slept less than two hours 😢. But, I got up and dressed and Koa and I started our "day".

    Thanks to all for your kindness and support during my "journey through daily life" :bear_love: I really appreciate it :bear_hugs: as it helps me to keep going on bad/harder days! :bear_nuzzle:

    :pixy_party: 💜 🍀 🐾

    #PixysJourney
    #WeirdFolks
    #ActuallyAuDHD
    #KoaKoolani

  24. I wired up a free model endpoint last month. I sent one request. It returned 200 OK. I shipped the feature. Then the tool calls never happened. The endpoint accepted the request. It just ignored half of it. Sound familiar?

    Here is my question. What does a 200 actually prove? My answer: almost nothing about capabilities. It proves the transport worked. That is it.

    So I stopped trusting status codes and started probing the contract. This post is the FAQ I wish I had read first. It ends with a script you can run in about two minutes.

    Myth 1: A 200 means the model supports my feature


    The server can accept a tools array and silently ignore it. The model then answers in prose. No error. No warning. Your code sees a normal response and skips the branch. Is that a bug in the model? No. It is a bug in your assumption.

    The corrected model: support is a property of the endpoint, not of the model name. Probe it. Record it. Re-probe when anything changes.

    Myth 2: finish_reason is optional metadata


    It is the most important field in the response. length means the model ran out of output budget. Your answer looks fine and is probably cut in half. I have watched a parser happily eat a truncated JSON object.

    {"choices":[{"finish_reason":"length","message":{"content":"{\"items\": [1, 2, 3, 4"}}]}

    If you do not branch on finish_reason, you are parsing whatever bytes arrived. That is not a feature. That is a coin flip.

    Myth 3: Streaming and non-streaming are interchangeable


    They are two different code paths. In streaming, finish_reason arrives in the final chunk, not the first. Some servers only report token usage when you ask for it explicitly. Some omit it entirely.

    Ask yourself: does my client read the last event? Mine did not, for a week. I was logging None as the finish reason every single time.

    Myth 4: JSON mode means my schema


    It means valid JSON. It does not mean your keys. It does not mean your types. Validate every response against a schema before it touches business logic. Treat model output like user input, because that is what it is.

    Myth 5: Retries are always safe


    Retry a failed read, fine. Retry a tool call that already wrote a row, and now you have two rows. I learned this from a duplicate charge, not a blog post.

    Add an idempotency key your tool honors. Make the retry decision depend on the operation, not on the exception class.

    The artifact: a five-minute capability probe


    This script uses only the Python standard library. It assumes a chat-completions-shaped endpoint. Adjust the paths if yours differs.

    # probe_capabilities.py — smoke test only, not a benchmark
    import json, os, time, urllib.request, urllib.error, concurrent.futures as cf

    BASE = os.environ["BASE_URL"].rstrip("/")
    KEY = os.environ["API_KEY"]
    MODEL = os.environ["MODEL"]

    def call(payload, stream=False, timeout=60):
    req = urllib.request.Request(
    BASE + "/chat/completions",
    data=json.dumps(payload).encode(),
    headers={"Content-Type": "application/json",
    "Authorization": f"Bearer {KEY}",
    "Accept": "text/event-stream" if stream else "application/json"},
    method="POST")
    t0 = time.time()
    try:
    with urllib.request.urlopen(req, timeout=timeout) as r:
    return {"status": r.status, "ms": int((time.time()-t0)*1000),
    "raw": r.read().decode("utf-8", "replace")}
    except urllib.error.HTTPError as e:
    return {"status": e.code, "ms": int((time.time()-t0)*1000),
    "raw": e.read().decode("utf-8", "replace")}

    def probe_truncation():
    p = {"model": MODEL, "max_tokens": 8,
    "messages": [{"role": "user", "content": "List ten colors."}]}
    r = call(p)
    if r["status"] != 200:
    return {"probe": "truncation", "ok": False, "why": r["status"]}
    ch = json.loads(r["raw"])["choices"]
    [0] return {"probe": "truncation", "ok": True,
    "finish_reason": ch.get("finish_reason"),
    "reports_usage": "usage" in json.loads(r["raw"])}

    def probe_tools():
    p = {"model": MODEL, "max_tokens": 128,
    "messages": [{"role": "user", "content": "Read ./README.md and report its first line."}],
    "tools": [{"type": "function", "function": {
    "name": "read_file",
    "description": "Read a file from disk.",
    "parameters": {"type": "object",
    "properties": {"path": {"type": "string"}},
    "required": ["path"]}}}]}
    r = call(p)
    if r["status"] != 200:
    return {"probe": "tools", "ok": False, "why": r["status"]}
    msg = json.loads(r["raw"])["choices"][0]["message"]
    return {"probe": "tools", "ok": True,
    "returned_tool_calls": bool(msg.get("tool_calls"))}

    def probe_json():
    p = {"model": MODEL, "max_tokens": 128,
    "messages": [{"role": "user",
    "content": 'Reply with only JSON: {"status":"ok","count":3}'}]}
    r = call(p)
    if r["status"] != 200:
    return {"probe": "json", "ok": False, "why": r["status"]}
    text = json.loads(r["raw"])["choices"][0]["message"]["content"]
    try:
    obj = json.loads(text)
    return {"probe": "json", "ok": True,
    "keys_match": sorted(obj) == ["count", "status"]}
    except json.JSONDecodeError:
    return {"probe": "json", "ok": True, "keys_match": False,
    "note": "not parseable as JSON"}

    def probe_concurrency(n=2):
    p = {"model": MODEL, "max_tokens": 16,
    "messages": [{"role": "user", "content": "Say ok."}]}
    with cf.ThreadPoolExecutor(max_workers=n) as ex:
    codes = list(ex.map(lambda _: call(p)["status"], range(n)))
    return {"probe": "concurrency", "ok": True, "statuses": codes,
    "saw_429": 429 in codes}

    if __name__ == "__main__":
    for fn in (probe_truncation, probe_tools, probe_json, probe_concurrency):
    print(json.dumps(fn(), sort_keys=True))

    Run it like this. Keep the key in the environment, never in the file.

    export BASE_URL="$YOUR_ENDPOINT"
    export API_KEY="$YOUR_KEY"
    export MODEL="$YOUR_MODEL"
    python3 probe_capabilities.py

    Reading the output: a decision table

    Probe resultWhat it meansWhat I do nextreturned_tool_calls: falseTools accepted, not acted onDrop the agent branch, or change endpointfinish_reason: "length" on an 8-token capNormal, expectedKeep the check; raise budget in real callsfinish_reason: null in streamingClient is not reading the final eventFix the parser before anything elsereports_usage: falseNo token accounting from serverCount tokens client-side, or accept blind costkeys_match: falseValid JSON, wrong shapeAdd schema validation at the boundarysaw_429: true at n=2Very low concurrency ceilingQueue work; never fan out blindly


    Nothing here measures quality. Nothing here measures speed. Those are different experiments with different controls.

    Where I run this


    I run probes from a throwaway box, not my laptop. Same reason I do not test migrations on my main database. The probe should not touch anything I care about.

    MonkeyCode's free model access and free server option are the two pieces I use for that. The free model access gives the probe something to talk to. The free server option gives it a disposable place to run. Disclosure: This article was prepared as part of MonkeyCode's product outreach.

    I am not claiming the free tier is fast, generous, or permanent. I do not know its limits, and I am not going to guess at them. Run the concurrency probe and read your own numbers. That is the whole point of this post.

    Limitations and who should skip this


    • This is a smoke test. It is not a benchmark and not a load test.
    • Results describe one endpoint, one model, one moment. They expire.
    • Paid tiers can behave differently from free ones. Re-probe after switching.
    • Only probe endpoints you own or are authorized to test.
    • Do not use this to grade answer quality. It checks contract shape only.

    Skip this approach if you need contractual latency SLOs, deterministic output, or guaranteed tool-call behavior. Buy a plan with a written contract. A probe will not save you from a missing SLA.

    The corrected mental model


    Treat every free endpoint as a set of separate promises. Transport, truncation, tool calls, JSON shape, and concurrency are five different promises. A 200 only confirms the first one.

    Which promise broke on your last integration? I keep a one-page probe log per endpoint now. It has saved me two weekends so far.#ai #api #testing #python #software #coding #development #engineering #inclusive #community
    200 OK Proves Nothing About Tool Calls: A Free-Model Capability FAQ With a Probe

  25. DATE: October 26, 2026 at 04:00PM
    SOURCE: PSYPOST.ORG

    ** Research quality varies widely from fantastic to small exploratory studies. Please check research methods when conclusions are very important to you. **
    -------------------------------------------------

    TITLE: Women reach orgasm more often alone, but partnered orgasms are more closely tied to sexual satisfaction

    URL: psypost.org/women-reach-orgasm

    Women tend to reach orgasm more often during solo sex than with a partner, but a new study suggests that partnered orgasms are the ones more closely tied to overall sexual satisfaction. The survey of nearly 28,000 users of a period-tracking app, published in Archives of Sexual Behavior, also found that a wider variety of partnered activities was linked to greater satisfaction, while variety in solo sex showed no such benefit.

    Sexual satisfaction refers to a person’s overall evaluation of how fulfilling and pleasurable their sex life is, a measure closely tied to overall health and quality of life. Past research has consistently linked women’s sexual satisfaction to how often they reach orgasm and to sexual variety, which is the number of different sexual behaviors a person engages in. For instance, a 2017 national survey of U.S. adults found that people in long-term relationships who incorporated a wider range of intimate behaviors and had more frequent orgasms tended to feel more satisfied with their sex lives.

    Reaching orgasm with a partner, however, is far less consistent for women than reaching orgasm alone, a disparity examined in a 2024 review of the partnered orgasm gap. That review noted that 38 to 92 percent of women usually or always climax when masturbating, and that women’s orgasm rates rise sharply when sexual activity includes direct stimulation of the clitoris, a small, highly sensitive organ at the top of the vulva. During partnered sex with men, routines often center on vaginal penetration alone, leaving many women without the stimulation needed to climax.

    Because solo sex is such a reliable source of orgasms, one might expect frequent masturbation to boost sexual satisfaction, yet prior research has yielded mixed results. Among studies of women in a 2024 systematic review, 40 percent found no link between masturbation and sexual satisfaction, a third found a negative link, and about a quarter found a positive one.

    The review’s authors argued that negative links may arise when masturbation compensates for unfulfilling or absent partnered sex, but they found that for women, masturbation more often seemed to complement partnered sex rather than replace it. The context of solo activity may also matter: a study covered by PsyPost in 2020 indicated that women who used vibrators both alone and with a partner reported higher sexual satisfaction than those who used vibrators only alone.

    Most earlier studies examined only a narrow set of partnered behaviors or treated masturbation as a single category without comparing specific solo and partnered activities side by side. To explore how distinct behaviors, variety, and orgasms relate to satisfaction across both contexts, Yella Hewings-Martin and Adam C. Cunningham of Flo Health UK Limited and their colleagues surveyed users of the Flo health app to test whether solo orgasms and variety relate to overall satisfaction the same way partnered ones do.

    The researchers recruited participants between April 11 and May 5, 2024, via in-app messages shown to adult English-speaking Flo users. From 70,424 initial responses, the team excluded users who did not complete the survey, lacked a valid app ID, or failed two attention-check questions, leaving 27,931 participants with an average age of 28 years. Nearly all respondents were biologically female (98.9 percent) and identified as women (96.4 percent); 70.7 percent identified as heterosexual, 23.1 percent as bisexual or pansexual, and 81.3 percent had a male partner.

    Respondents reported on their sex lives over the previous six months, rating their overall sexual satisfaction on a five-point scale and their orgasm frequency from never to almost always. They also rated how often they engaged in 13 partnered and 13 solo sexual activities, including vaginal penetration, clitoral stimulation by hand or vibrator, watching erotica, and role-play, and how often each behavior led to orgasm. Multiplying activity frequency by orgasm frequency yielded weighted orgasm scores for solo and partnered contexts. Those who climaxed more often in one setting than the other selected up to three reasons from 22 options to explain why.

    Across the full sample, 56.2 percent of participants were moderately or very satisfied with their overall sex life, while 19.5 percent were moderately or very dissatisfied. Roughly 36.9 percent reached orgasm almost always or always, and 22.9 percent did so most of the time, whereas 20.6 percent climaxed less than half the time or never. Overall orgasm frequency had a moderate positive correlation with sexual satisfaction (r = 0.38, on a scale where 1 would be a perfect match): 61.2 percent of very satisfied respondents reached orgasm almost always, though 19.5 percent of very dissatisfied respondents also climaxed almost every time.

    The data showed a difference between the behaviors performed most consistently at every encounter and those practiced by the widest share of women overall. Vaginal penetration without other stimulation was the partnered behavior most consistently performed every time (39.7 percent), but clitoral stimulation by a partner’s hand, mouth, or tongue was the most widespread partnered activity overall (90.2 percent at least sometimes), followed closely by vaginal penetration paired with other body stimulation (90.1 percent) and by vaginal penetration paired with clitoral touch (90.0 percent).

    The authors noted that clitoral stimulation topping the list of widespread partnered behaviors contrasts with older surveys where vaginal intercourse was most common. They suggest this likely reflects their more detailed questions about a six-month period, though they also speculate that it could partly reflect a younger sample (38 percent of respondents were aged 18 to 25).

    In solo sex, clitoral stimulation by hand was both the most widespread behavior (84.6 percent) and the most consistent (44.5 percent every time), while only 5.5 percent practiced solo vaginal penetration alone every time. Across all 13 paired comparisons of similar activities, women reached orgasm more frequently when alone than with a partner, with differences ranging from small to moderate. Overall, 47 percent of participants reported reaching orgasm more often during solo sex, compared to 21 percent with a partner and 27 percent who reported no difference.

    In solo sessions, clitoral stimulation with a vibrator or dildo, watching erotica, and clitoral stimulation by hand were linked to the highest orgasm rates. During partnered sex, the highest orgasm rates came from using sex toys together, combining vaginal penetration with clitoral stimulation, and masturbating with a partner present, while vaginal penetration alone and anal stimulation were linked to the lowest rates in both contexts.

    Participants’ own explanations pointed to both psychological and physical factors. Women who climaxed more often alone most commonly cited inadequate stimulation from a partner, an absence of pressure to perform, reduced body image self-consciousness, and feeling safer to let go because they controlled the stimulation. Many also pointed to partnered obstacles such as a partner finishing too soon, difficulty communicating preferences, life stress, or painful intercourse. By contrast, those who reached orgasm more often with a partner emphasized emotional intimacy, adequate partner stimulation, and heightened arousal from attraction to their partner.

    To examine how solo and partnered experiences predicted overall sexual satisfaction, the authors analyzed the 19,469 respondents who had engaged in partnered sex during the past six months. Partnered orgasm frequency was the strongest positive predictor of sexual satisfaction, whereas solo orgasm frequency showed a tiny negative association in initial models and was not statistically significant in the final model. Participants averaged 7.79 of the 13 partnered activities and 6.45 of the 13 solo activities; greater partnered variety predicted higher satisfaction, while greater solo variety was weakly associated with lower satisfaction. Together, these factors accounted for about 16 percent of the differences in satisfaction between participants.

    In a separate model of 20,805 partnered-sex participants controlling for relationship status, being in a relationship and engaging in greater partnered variety both predicted higher overall orgasm frequency, whereas solo variety was not statistically significant. That model accounted for about 7 percent of the differences in orgasm frequency between participants.

    The positive tie between partnered climax and satisfaction aligns with research covered by PsyPost in 2018, which examined heterosexual newlywed couples rather than a broad sample of female app users and similarly found that a woman’s partnered orgasm frequency is positively linked to her sexual satisfaction. At the same time, the findings on solo sex and variety stand in tension with a study covered by PsyPost in 2022, which linked frequent masturbation in women to higher sexual satisfaction alongside frequent intercourse and variety. That earlier study, however, looked at overall masturbation frequency across a broad adult population, whereas the new study specifically evaluated solo orgasm frequency and sexual variety among female app users.

    There are a few things to keep in mind when interpreting these findings. Because the survey captured data at a single point in time, it cannot establish cause and effect: women who already feel happy and secure in their relationships may simply feel more comfortable exploring a wider variety of activities with their partners, while women experiencing an unfulfilling partnered sex life may turn to solo masturbation and try more solo techniques to compensate. In addition, sexual satisfaction was measured with a single question about a respondent’s overall sex life, which many people may naturally judge based on their partnered relationships rather than their solo habits. The large sample size also makes it possible to detect tiny statistical differences that have little practical impact in daily life.

    The sample consisted of English-speaking users of a health tracking app who were mostly young, White, and heterosexual, and about half held a bachelor’s degree or higher. Because participants volunteered for a study described as being about female orgasms, they may be more comfortable discussing sex, or more sexually active, than women in general. Four of the authors are employees of Flo Health with equity in the company, and the other three are consultants for it.

    The authors suggest that bringing elements of solo sex into partnered encounters, such as open communication about preferences and less pressure to perform, could help narrow the gap between solo and partnered orgasms. Future research tracking couples over time could help explain how emotional closeness, trust, and communication interact with physical stimulation to shape sexual fulfillment.

    The study, “Sexual Satisfaction and Orgasm Experiences During Partnered and Solo Sex Among 27,931 Users of the Flo App,” was authored by Yella Hewings-Martin, Adam C. Cunningham, Jordan Rullo, Karen L. Blair, Carley Prentice, Anna Klepchukova, and Liudmila Zhaunova.

    URL: psypost.org/women-reach-orgasm

    -------------------------------------------------

    Private, vetted email list for mental health professionals: clinicians-exchange.org

    Unofficial Psychology Today Xitter to toot feed at Psych Today Unofficial Bot @PTUnofficialBot

    -------------------------------------------------

    #psychology #counseling #socialwork #psychotherapy @psychotherapist @psychotherapists @psychology @socialpsych @socialwork @psychiatry #mentalhealth #psychiatry #healthcare #depression #psychotherapist #SexualHealth #SexualWellness #WomensHealth #FemaleOrgasm #SexualSatisfaction #OrgasmGap #Intimacy #HealthyRelationships #SexualityResearch #HealthResearch

  26. Even as the Mamdani Administration Touts Faster Government, It’s Time to Hit Pause on Bergen Green

    With the mayor’s office now producing and running ads for “faster government” and backing the ballot measures that “speed up” review of city projects, it seems unlikely that Mamdani administration will do the right thing when it comes to Bergen Green: slow down, take a second look at how the Adams administration handled the award process, and address any problems or irregularities. Instead, it seems, the city will move ahead at 516 Bergen Street with a developer recently found in federal court to have put workers and residents at risk at multiple affordable housing sites across the city, in Manhattan, the Bronx, and Brooklyn.

    In an email dated September 30, a representative from City Council member Crystal Hudson’s office tells concerned neighbors that her office:

    will flag this for HPD, but to level expectations I do not expect this information to trigger the city to select a new bidder as the RFP bidding process has already been finalized. That said, we certainly understand the concerns raised from the consent decree [issued in US v. Apex Building Company] and will ask HPD to ensure there is testing done and measures implemented to mitigate construction dust and relevant training/notification is conducted.

    This response skirts the issue; and it promises only that HPD will be asked “to ensure” that the Bergen Green developer follows the law. That would be the bare minimum requirement. The problem that the city still needs to address is that the Bergen Green bidding process appears to have been “finalized” without taking into account – or while actively and deliberately ignoring – the 2023 judgment and consent decree against Apex Building Company, and without fully and publicly disclosing this company’s track record on other affordable housing projects in New York City.

    Local residents were asked to weigh in on the project but given an incomplete picture. The award process was conducted without complete candor and without fully informing the public.

    The FOIL requests that I filed last month may help fill in some gaps. Documents released by the Department of Investigation in response to one request suggest that the paperwork on which the city relied when making this award does not square with the facts in the public record. A Vendor Disclosure Form on file with the Department of Investigation omits any mention of the judgment in United States v. Apex Building Company and whitewashes the developer’s record. Subsequent responses to FOIL should help determine whether the company’s adjudicated misconduct was taken into account at all when assessing its bid.

    What more can be ascertained about Apex’s business conduct from the public record, in the meantime? Apex Building Company, Apex Building Group, and the principals of those companies are named as parties in a number of New York State Court cases. These fall into different categories.

    There are, not surprisingly, a few commercial contract disputes over non-payment. These sorts of disputes may come with the territory for New York City developers, but they can also cause serious project delays and add to financial risk. For people living near the project, a developer’s legal and financial problems can translate to prolonged disruptions and degradation of local living conditions.

    Many other cases brought against Apex in New York State Courts are for torts and negligence. Someone was injured on the job; another person tripped at a job site; yet another person crashed his scooter into a bin. Again, builders and developers typically get taken to court over this kind of thing, so it’s not all that surprising to come across these complaints. But they suggest the kind of hazards that demolition and construction at 516 Bergen Street will bring to the neighborhood.

    Bergen Street is already a hazardous place for pedestrians and cyclists, due in part to the heavy automobile traffic heading toward Flatbush and double parking in the bike lane, and due also to the fact that the north-side sidewalks from the Bergen Street playground to Flatbush are obstructed by police parking. The vehicles and heavy machinery at the site during demolition and construction (which is scheduled to last four years) will exacerbate these problems, make the snarl of traffic at the intersection of Bergen Street and 6th Avenue even worse than it currently is, and introduce new hazards. What’s the plan? At a September 2025 meeting with the developer, neighbors were told that it was “unclear” where workers will park their vehicles when arriving at the site; and though I have asked on a number of occasions about coordination with DOT, I have not gotten a clear answer and to the best of my knowledge there has been no coordination and no plan keep the Bergen Street bike lane and sidewalks clear.

    Perhaps the most striking case of all in the New York State Court docket is one brought just last year: Department of Housing Preservation and Development of the City of New York v. HP Plaza LLC. In this case, Robert Horsford, President and Chairman of Apex Building Group, is among the defendants sued by HPD for violations of the New York City Housing Maintenance Code, specifically for “failure to provide heat and hot water, as required by law.” The very city agency that awarded Horsford’s company the contract for affordable housing at Bergen Green in 2024 had found, just one year earlier, in 2023, that another Horsford Company, HP Plaza LLC, failed to maintain basic living conditions at an affordable housing development. And HPD prevailed against Horsford and his co-defendants in court, with the judge imposing a penalty and ordering them to provide heat and hot water and boiler maintenance for residents of 310 West 148th Street – part of the West 148th affordable and low-income housing initiative.

    Do any internal HPD records related to the Bergen Green award even acknowledge this misconduct? Was any of the history I’ve reviewed in this post and in my first post on Bergen Green taken into account? Why should local residents expect the Bergen Green project to be handled more responsibly than other Apex projects?

    Business conduct can get easily overlooked or set aside when government moves faster and refuses to address public concerns. And a record of misconduct, and of putting the public at risk, can easily get buried when government contracts are awarded to cronies. What’s come to light about the Bergen Green project so far suggests that it would be appropriate for the current administration to hit pause on the project, look at how the Adams administration handled the Bergen Green award, and at least offer neighbors some assurances and a more candid assessment of the developer’s record.

    Beyond that, everyone should take a second look at the initiatives for “faster government” currently being touted by the Mamdani administration, and acknowledge the risks and costs to ordinary New Yorkers that speeding up review and shutting out the public can entail.

    #affordableHousing #bikeLanes #businessEthics #environmentalReview #EricAdams #ethics #fasterGovernment #FOIL #NIMBY #pedestrianSafety #permitting #urbanCycling #YIMBY
  27. DATE: October 26, 2026 at 12:00PM
    SOURCE: PSYPOST.ORG

    ** Research quality varies widely from fantastic to small exploratory studies. Please check research methods when conclusions are very important to you. **
    -------------------------------------------------

    TITLE: Frequent cannabis use linked to higher odds of nighttime breathing problems

    URL: psypost.org/frequent-cannabis-

    Adults who use cannabis are more likely to report loud snoring and pauses in breathing during the night, according to new research published in Sleep Health: Journal of the National Sleep Foundation. The findings indicate that more frequent cannabis consumption corresponds with higher odds of experiencing these nocturnal breathing issues, even after accounting for factors like body weight and tobacco smoking. This relationship raises important questions for the growing number of people who turn to cannabis as a sleep aid.

    Sleep-disordered breathing is an umbrella term for medical conditions characterized by abnormal respiratory patterns or insufficient ventilation during rest. The most common form is obstructive sleep apnea, a disorder in which the muscles in the back of the throat relax too much, causing the upper airway to narrow or collapse entirely. People with this condition require extra physical effort to breathe, often resulting in loud snoring, gasping, or brief, repeated stops in breathing known as apneas. Standard treatments like continuous positive airway pressure machines, oral appliances, and surgery can be effective, yet many patients find the devices uncomfortable or difficult to tolerate over the long term.

    At the same time, cannabis has become increasingly accessible across the United States, and difficulty sleeping is one of the most common reasons people cite for using it. While users frequently report that the plant helps them rest, controlled clinical trials examining cannabinoids and sleep have produced mixed outcomes.

    For example, a 2023 clinical trial covered by PsyPost found that consuming medicinal cannabis oil improved sleep duration and increased midnight melatonin levels in adults with insomnia, whereas a study covered by PsyPost in 2024 indicated that a cannabis compound called cannabinol reduced nighttime awakenings when taken alone but showed no benefit when combined with cannabidiol, another cannabis compound. Observational tracking also points to potential drawbacks, such as a 2026 longitudinal study of military service members that linked current cannabis use to worse overall sleep quality and longer times needed to fall asleep.

    When it comes to breathing disorders specifically, tetrahydrocannabinol, the primary psychoactive compound in cannabis, has shown some potential to stabilize breathing in animal experiments and small human trials using oral pills. However, the broader clinical evidence remains inconsistent, leading the American Academy of Sleep Medicine to formally advise against using cannabis to treat obstructive sleep apnea. Most everyday consumers inhale cannabis rather than taking standardized pills, exposing their airways to smoke and heat that could inflame the tissues of the throat.

    The new research, led by Tyler J. Gallagher, a resident physician in the Caruso Department of Otolaryngology-Head and Neck Surgery at the Keck School of Medicine of the University of Southern California, and co-first author Matthew E. Lin of the David Geffen School of Medicine at the University of California, Los Angeles, sought to evaluate how everyday consumption relates to signs of breathing issues at night.

    “While some studies have explored cannabinoids as potential treatments for obstructive sleep apnea, there has been relatively little population-level research examining whether real-world cannabis use is associated with common signs of sleep-disordered breathing, such as loud snoring and pauses in breathing during sleep,” Gallagher told PsyPost. “We sought to better understand this relationship using a nationally representative sample of US adults.”

    To investigate this connection, the authors analyzed information from the 2017 to 2018 Behavioral Risk Factor Surveillance System, a state-based telephone survey coordinated by the Centers for Disease Control and Prevention. Although nearly 900,000 adults completed the main survey during those two years, only Minnesota and Tennessee included optional survey modules asking about both cannabis habits and sleep breathing symptoms. From the respondents in those two states who had complete data, the researchers selected a stratified random sample of 14,485 adults designed to match the demographic profile of the broader United States population.

    Participants were asked how many days they had used marijuana or cannabis during the past 30 days, as well as their primary method of consumption and whether they used it for medical or recreational purposes. The researchers grouped the respondents into three categories: non-users (zero days in the past month), non-regular users (1 to 15 days), and regular users (16 to 30 days). Signs of sleep-disordered breathing were assessed using two yes-or-no questions asking if anyone had ever observed the respondent stop breathing during sleep, and if the respondent had ever been told that they snore loudly.

    Of the participants, 13,461 reported no current cannabis use, 438 were classified as non-regular users, and 364 were regular users, meaning about 5.5 percent of the sample currently used cannabis. Smoking was by far the most common consumption method, reported by about 87 percent of both non-regular and regular consumers, followed by vaporizing and eating. Among non-regular users, 61.6 percent used cannabis strictly for recreational reasons, whereas 37.6 percent of regular users reported using it strictly for medical reasons and another 24.7 percent used it for both medical and recreational purposes.

    Overall, signs of sleep-disordered breathing were common across the entire cohort, with 44.7 percent reporting either loud snoring or witnessed apneas. In the unadjusted raw numbers, 44.3 percent of non-users reported at least one of the two breathing signs, compared to 48.4 percent of non-regular users and 55.2 percent of regular users. Specifically, witnessed breathing pauses were reported by 15.3 percent of non-users, 17.1 percent of non-regular users, and 19.8 percent of regular users. Loud snoring was reported by 41.3 percent of non-users, 44.5 percent of non-regular users, and 50.0 percent of regular users.

    To account for other differences between users and non-users, the researchers ran statistical models that applied national survey weights (statistical adjustments that make a sample better mirror the U.S. adult population) and controlled for a wide range of potentially confounding factors. These adjustments accounted for age, sex, race and ethnicity, education, income, health insurance status, diabetes, body mass index, alcohol consumption, traditional cigarette smoking, and electronic cigarette use. Even after factoring out the influence of tobacco smoking and body weight, cannabis use remained independently associated with higher odds of sleep-disordered breathing symptoms.

    Compared to non-users, non-regular cannabis users had 41 percent higher odds of reporting witnessed apneas, 26 percent higher odds of reporting loud snoring, and 33 percent higher odds of experiencing either symptom. The association was more pronounced among regular consumers. Those who used cannabis 16 to 30 days per month had 73 percent higher odds of witnessed apneas, 68 percent higher odds of loud snoring, and 82 percent higher odds of reporting either sign compared to non-users. These figures describe odds rather than probabilities, so the absolute differences are smaller than the percentages might suggest; in the raw numbers, about 55 percent of regular users reported at least one sign, compared with about 44 percent of non-users.

    “While the impact of infrequent use is relatively small, the odds of irregular breathing during sleep almost double with more frequent cannabis use, making this a strong association worthy of consideration before frequent cannabis utilization,” Gallagher explained.

    The researchers also analyzed cannabis consumption as a continuous spectrum from zero to 30 days. In the weighted models, each additional day of cannabis use per month was associated with an approximate 2 percent increase in the odds of reporting witnessed apneas, loud snoring, or either sign, an estimate the authors note is clinically small and serves as a general summary across use levels rather than a strict per-day effect. When the authors repeated the analysis without the national survey weights, regular cannabis use remained linked to both breathing signs, though the estimates were smaller (for example, 36 percent higher odds of either sign rather than 82 percent). In that analysis, non-regular use was no longer linked to loud snoring or to either sign, and its link with witnessed breathing pauses sat right at the threshold of statistical significance.

    “The strength of the association and its greater magnitude among more frequent users were notable, particularly given that some studies have investigated cannabinoids as potential treatments for sleep apnea,” Gallagher said. “These findings may reflect differences between isolated cannabinoids studied in clinical settings and real-world cannabis use, including differences in composition and method of consumption.”

    The authors proposed two primary biological mechanisms that might explain why cannabis consumers report more signs of airway obstruction at night. Because roughly 87 percent of the consumers in the sample smoked their cannabis, physical irritation from smoke is one possible contributor. Unlike tobacco, cannabis smoke is typically inhaled through deeper breaths without a filter, and it burns at a higher temperature, which can cause thermal injury and inflammation in the throat tissues that narrow the upper airway.

    A second potential mechanism involves the way cannabis interacts with the autonomic nervous system, which regulates involuntary body functions. While small doses of cannabis tend to stimulate the sympathetic nervous system, the body’s “fight or flight” system, higher doses activate the parasympathetic nervous system, which promotes physical relaxation. Frequent users may develop tolerance and consume larger quantities, and the resulting parasympathetic activity may cause the muscles that hold the upper airway open to relax excessively during sleep, making the throat more likely to collapse.

    There are a few things to keep in mind when interpreting these findings. Because the survey captured information at a single point in time, the study cannot establish whether cannabis use causes sleep-disordered breathing or if the relationship works in the opposite direction. People who suffer from undiagnosed sleep apnea often experience fragmented, unrefreshing sleep, and it is possible that some of these individuals turn to cannabis in an attempt to self-medicate their exhaustion or insomnia. The researchers also could not account for factors such as sleeping pill or sedative use, heavy drinking, or psychiatric conditions, any of which might influence both cannabis use and nighttime breathing.

    The reliance on self-reported telephone survey data also introduces constraints. Asking participants if they have been told they snore or stop breathing is less reliable than conducting an overnight medical sleep study, and people who sleep alone may be unaware of their nighttime breathing habits. Additionally, the survey only tracked how many days a person used cannabis over the past month, without measuring the exact dosage, potency, or ratio of specific compounds like tetrahydrocannabinol and cannabidiol.

    The data came from just two states, Minnesota and Tennessee, because they were the only ones to include both sets of questions, and roughly 98 percent of the original survey respondents were excluded for that reason or because of missing information. Survey weights help align the sample with national demographics, but the authors note that applying them to such a small subset is debated among statisticians. In addition, the breathing questions asked whether these symptoms had ever been observed, while the cannabis question covered only the past month, so some symptoms may have predated participants’ current cannabis habits.

    Gallagher emphasized that reporting these symptoms is not the same as receiving a formal medical diagnosis. “While obstructive sleep apnea – a clinically defined and hazardous intermittent airway obstruction during sleep – is a type of sleep-disordered breathing, this study cannot make conclusions about the association between cannabis use and sleep apnea or other associated long-term risks,” he noted.

    Future research will need to incorporate objective sleep testing, such as polysomnography, an overnight sleep study that monitors breathing, oxygen levels, and brain activity, to verify whether cannabis habits correspond with clinically diagnosed sleep apnea. Scientists also need to compare different delivery methods, such as edibles versus inhalation, to separate the chemical effects of cannabinoids on throat muscles from possible damage from inhaling hot smoke.

    “Further research is required to examine the long-term effects of cannabis use on sleep and to determine the effects of cannabis dosage, different cannabis compositions, and different methods of consumption on sleep-disordered breathing,” Gallagher said. “Additionally, the long-term consequences of these impacts must be studied.”

    Until those relationships are clarified, the authors suggest that physicians should counsel patients about the potential respiratory risks of using cannabis, particularly for individuals who already show signs of sleep-disordered breathing. “People experiencing persistent snoring, pauses in breathing, or other symptoms of sleep apnea should seek medical evaluation rather than trying to utilize cannabis to manage their sleep,” Gallagher advised.

    “This study highlights the importance of evaluating the broader health effects of substances that people increasingly use for self-management,” Gallagher added. “Cannabis may have benefits for certain symptoms or conditions, but those potential benefits should be considered alongside possible risks. Sleep-disordered breathing is particularly important because it can go unrecognized for years while causing significantly worse quality-of-life. We hope these findings encourage further research and help clinicians have more informed conversations with patients who use cannabis for sleep-related concerns.”

    The study, “Cannabis use and associated sleep-disordered breathing among US adults,” was authored by Tyler J. Gallagher, Matthew E. Lin, Ian Kim, Ziva D. Cooper, Sebastian M. Jara, and Eric J. Kezirian.

    URL: psypost.org/frequent-cannabis-

    -------------------------------------------------

    Private, vetted email list for mental health professionals: clinicians-exchange.org

    Unofficial Psychology Today Xitter to toot feed at Psych Today Unofficial Bot @PTUnofficialBot

    -------------------------------------------------

    #psychology #counseling #socialwork #psychotherapy @psychotherapist @psychotherapists @psychology @socialpsych @socialwork @psychiatry #mentalhealth #psychiatry #healthcare #depression #psychotherapist #Cannabis #SleepHealth #SleepApnea #SleepDisorderedBreathing #LoudSnoring #NighttimeBreathing #RespiratoryHealth #HealthResearch #MedicalResearch #SleepAwareness

  28. Tokens Over Hires

    In the middle of September I ran ccusage against every Claude Code session on my laptop since May. It walks the local logs, counts the tokens, and prices them at what the API would have charged. I expected a big number. What came back was about twenty billion tokens and just under fourteen thousand dollars, across every project I’d touched in four months, with most of it going to Pepper, which is now open for signups, so go check it out. Nineteen billion of those tokens were cached reads.

    I sat with that for a minute. Fourteen thousand dollars is real money. At my current pace it works out to roughly thirty thousand a year. I could triple it and spend a hundred thousand dollars a year on tokens, and that still isn’t one engineer. In exchange, Chris and I have shipped more code than I’ve shipped in any stretch of my career. I wrote in September that the two of us merged 657 pull requests in our first thirty days with a budget instead of a platform team. When I put the ccusage number in those terms on a panel, it came to about a dollar fifty a pull request.

    That number is what my laptop would have cost at API prices, and it isn’t what we actually pay. Here’s the whole bill for both of us. Two Codex subscriptions, one each, are $200 a month. Anthropic is $550 a month: a Max plan for me and Chris, plus two Vycari team seats, one for Chris and one that runs our automation. I have an Ollama subscription at $200 a year. Greptile is about $1,500 a month. All in, that’s a little under $2,300 a month, or about $28,000 a year, for both founders and every pipeline we run. It still isn’t one engineer.

    The obvious conclusion is the one a friend reached when he heard the figure: if code is that cheap, just get more tokens. I thought so too, for about a day. Then I looked at what was actually slowing us down, and the token budget wasn’t on the list.

    The Constraint Is Attention

    Every agent I run needs things from me that tokens can’t buy. It needs a plan approved before it starts. It needs its pull request read when it finishes. When it hits something it can’t decide, it escalates, and somebody has to be there to answer. None of those steps is expensive on its own. The problem is what happens when I run enough agents that the steps overlap.

    When I run too many agents, the cost goes up a little and the risk goes up a lot. The biggest thing that’s slipped past us so far was how we managed database connections. It got out of hand, a little at a time, while my attention was on other pull requests, and eventually it caused an outage. Chris had to roll forward while I was out of town, and I spent the following week building a proper database abstraction layer. He put it more bluntly than I would have: the thing that kills us is splitting our attention. That’s when stuff slips through.

    When people ask how we decide what to spend, I give them the order. Optimize for human time, because that’s the scarcest thing we have. Then money, because that’s the second scarcest. Then everything around agent time. “I can waste agent time all day. I don’t care.”

    So the number that limits us is how many agents one person can supervise well at the same time. I don’t have a precise figure for that ceiling. I know I’ve been over it, because I can feel the difference between a day when every pull request got a real read and a day when I was skimming to keep up.

    Another friend told me recently about engineers at his company running up bills in the thousands to build simple internal copies of SaaS tools. His reluctant guess was that they just aren’t as good at using agents yet, and that it’s a skill people have to develop. I don’t know what they’re doing differently. It doesn’t sound like token maxxing, which I’ve never really understood either. I’d love to sit with engineers who run up giant bills and just watch. My guess is they’re using the agents inefficiently, and that what’s missing is supervision, which a bigger budget won’t fix.

    Building for More Agents per Person

    Almost everything I’ve built since the summer has been an attempt to raise that ceiling, and almost none of it has been about spending less.

    The pipeline I described in The Agent That Never Merges is the first piece. Agents open pull requests continuously and never merge them, which means the supervision cost per pull request is bounded at one careful read. The pipeline absorbs the rest: triage, planning, the first round of review comments, the retries. I only see the work once it’s in a state worth my attention.

    The second piece is where the work lives. I wrote about pulling Pepper apart into small, bounded repositories to keep CI fast and give agents less to load. It mattered just as much for my attention. An agent working in a repository with one job produces a pull request I can evaluate in one sitting.

    We’re up to fourteen repositories now. Last week I moved our iOS app out of the monorepo into its own. That was 150,000 lines of code, and nobody noticed except Chris, who had to wait a day to land his next batch of iOS changes. Agents make refactors that size easy. Having the CLI and the iOS client in their own repositories also forces us to keep good API definitions between the server and its clients.

    The third piece is delegation inside the agent layer itself. I run two Claude Opus 5.5 orchestrators on medium effort. One is the UTL, for uber tech lead, and its job is to spawn subagents that build features. The other is what I call the focused worker, and its job is working with me. It catches the manual tasks that come out of the UTL’s pull requests and keeps them in a ledger. Then we work through them together: systems changes, bringing up new platforms, migrating data, anything that needs my level of access and oversight. Everything else goes to a subagent under the UTL, Opus for design docs and code reviews, Sonnet for implementing a feature from a design doc. Every one of these agents can consult a model a tier above it as an advisor, and they all share a wiki for notes.

    Anthropic is now advertising much the same pattern with Claude Projects, and I’m happy to see others arriving at the same answer. Chris has been building a loop that babysits open pull requests through review until they score well enough to be worth a human’s time. Each layer like that turns a job I used to do by hand into something I check. The ceiling goes up one delegated task at a time.

    The Token Budget Was the Easy Problem

    There was a week in September when the meter really was the constraint. We ran through our free credits and paid about $120 in overage. Then AutoDev ate the whole Vycari quota, and I did server cleanup by hand because I couldn’t do anything else.

    Most of that was self-inflicted. I’d started with Fable as the orchestrator, with no cap on context, and burned a week’s quota in three days. The setup above fixed it. The orchestrators run on medium effort, and the cheaper model does the implementing. Opus answers the reviews because Sonnet is too literal about them, and a literal reading turns two review cycles into twelve. Every agent auto-compacts at 200K tokens, because Anthropic charges more for context past that point. With that setup, and the work spread across parallel sessions, I find it hard to spend all of my quota. My goal now is to hit 99% of it every week just before it resets. I keep a list of research projects, and if I have quota left 24 hours before the reset, I spin one up. That isn’t the same as maxing out tokens. I’m not trying to use as many as possible. I’m trying to use all the ones I’ve already paid for.

    There’s also a second account on the same machine. Claude Code reads a CLAUDE_CONFIG_DIR environment variable, so two shells with two config directories give you two accounts side by side. The second one runs the AutoDev and code review pipelines, and those use up its quota every week, so it isn’t a fallback for my own sessions. When I do run short, I supplement with other labs’ plans. Every one of those fixes took an afternoon or less. None of the supervision problems above has had an afternoon fix.

    Where the Money Actually Goes

    While I had the numbers in front of me, I looked at where development spend actually lands, because it isn’t where I expected either.

    Development tokens currently run about ten times what the product itself consumes, even with real people using it. Building the thing costs more than running it. That won’t last. The feedback from our private beta has been really good, and we now open Pepper to a limited number of new signups every day, so product usage is rising quickly.

    Most of what we actually pay goes to code review. Subscriptions are the cheap way to buy tokens if you’re willing to hit limits, so they’re the smaller line. Greptile reviews every pull request we open, and at about $1,500 a month it’s our biggest single expense. We both think it’s worth it, because it’s the layer that lets the never-merge pipeline run without me reading every first draft.

    In October I tested that. I spent a few days building a cheaper reviewer to replace it. I came out the other side saying, “I think we should just pay for it because I can’t do it cheaper.” What I could change was how often we call it. The agents kept asking for a re-review before they’d fixed anything. Because every repository shares a common dev environment, the fix went in once: our pull-request skill now has agents run /simplify and then /code-review before they’re allowed to open a pull request. On many of our repositories, our own reviewer also does the first round and only then calls Greptile. My goal is a pipeline where Greptile’s reviews come back with nothing to say. We’re not there yet, but we get a little better every week.

    I’d rather pay for review than have a second person do it, and the reason isn’t salary. The person would need supervising too, because review is a job I’d have to check, not one I can hand off.

    What a Hire Is For Now

    Five years ago, if I’d been getting a product like this ready for market, I’d have been hiring twenty to fifty engineers. The work would have needed that many hands, and most of what they’d have done was write code. Today the code is the cheap part. If I bring someone in to write code, I’ve added a person who needs plans approved and pull requests read, which is the exact resource I’m short on. A hire whose job is output adds coordination faster than it adds capacity.

    I said on a podcast that came out last week that the code I’ve written would have cost about fifteen thousand dollars at API prices, and that I couldn’t hire engineers for that money. That’s true. The engineers I’d still want are a different kind from the ones I hired at Google. We need a few more people who can herd agents, not fifty.

    The engineering hire that adds capacity is a different shape. It’s someone who can own a bounded service whole. Here’s the interface, here’s everything it needs to do, let me know when it’s done. That person brings their own supervision. They run their own agents, read their own pull requests, and answer their own escalations, and the only thing that crosses the boundary between us is the contract. Supervision divides along the interface instead of piling up on one person. That’s a tech lead’s job, and it’s the only kind of engineering hire I can see that raises the ceiling instead of lengthening the queue.

    That raises a fair question about how anyone grows into that job now, which I tried to answer in The Questions Are the Job. The other advice I give is to work on open source. I’ve met people who showed they could work really efficiently with agents through open source projects, Gemini CLI in particular, and some of them ended up being hired onto my teams. Open source has its own problems right now. But if you show up as a thoughtful engineer with features or bug fixes that are well reviewed, well tested, and bring value to the project, I think you’ll be welcome. That’s one of the reasons I decided to open source the Pepper CLI.

    The first hire probably isn’t an engineer at all. I’ve said this a few times now, including on stage at a panel in September. Neither Chris nor I are go-to-market people, and I may hire one before I hire another engineer. I can create piles and piles of code, even relatively good code. What I can’t do is agentically acquire customers. (Did I mention that Pepper is open for signups now?) Someone in marketing came up after the panel and told me I’d validated her existence.

    The Third Trend

    I’ve watched this happen twice before. Open source developer tooling made it so a small team didn’t need to buy or build its own compilers, databases, and frameworks. Cloud infrastructure made it so that team didn’t need to own hardware or a data center. Each time, the number of people you needed to start something real dropped, and the skills that mattered shifted toward the people who understood systems well enough to compose what was suddenly free.

    Agentic tools are the third one. Anyone with a good idea can now get from concept to production on a budget that would have been a rounding error in a Google planning cycle. But the constraint didn’t vanish. It moved, the same way it did the last two times, toward the people who understand systems design well enough to drive the agents and notice when something has slipped through. I wrote a year ago that management skills were going to carry over to working with agents. I didn’t expect to be proving it with a two-person org chart and fourteen thousand dollars of tokens.

    This isn’t only a small-company problem. At Google it was hard to get more than a few changes in a day, because each one waited on code review. I’ve talked to engineers there who now do all their work in experimental directories that don’t require review, then port it back to their team’s repository at a pace the review process can keep up with. That’s what happens when you don’t manage for human attention. Productive people spend their cycles waiting on the process.

    When other companies ask me what to change, my answer has become: drive until human attention is the scarce resource, then build for that. If you’re reading your own ccusage number and wondering whether the answer is more tokens, look at where your attention went first. For us the answer has been more interfaces. Those are the places where one person’s supervision ends and another’s begins, or where an agent takes over a job one of us used to do by hand.

    #Agents #AI #Developer #Startups
  29. Sarcator – The Ones We Follow Review By Creeping Ivy

    Last year, Sarcator flew under the radar with a pretty rad platter. On the heels of their mixed sophomore outing, 2025’s Swarming Angels & Flies served up delectable blackened thrash with necrotic notes and refreshing traditional/surf-rock side dishes. A year later, I’m surprised to see them already plating The Ones We Follow. Also surprising was word that this Swedish trio has all but abandoned thrash on album four, adopting a flavor profile they don with a curious descriptor: ‘death’s rock.’ Skepticism-inducing as any major sonic shift should be, the rock elements of Swarming Angels & Flies did elevate my excitement over Sarcator’s riffy brand of thrash with the crispy skin. In turning this element into the main course, I’m left wondering if these young Swedes returned to the kitchen prematurely.

    Despite the generic shift, Sarcator still retain the unhinged aggression characterizing their blackened thrash menu. Indeed, guitarist/vocalist Mateo Tervonen belts an acerbic ‘owww!’ on opener “The Ones We Follow,” with drummer Jesper Rosén speeding between kit pieces underneath. It’s the guitar work, however, that distinguishes old from new Sarcator. Rather than relying on syncopated palm mutes and serpentine riffs, Tervonen and Leo Buchalle favor twangy licks and careening power chords. The solos also affirm this new, ‘classic’ approach, adding bluesy soul into the mix. Almost rockabilly in nature, it’s as if Hellripper collided with Shadowy Men on a Shadowy Planet. As the record progresses, Sarcator introduce a host of country western elements—slide guitar, harmonica, the occasional snake rattle—with big Wayfarer1 energy (“Volatile Insight,” “Ain’t Fit to Live”). These country western-isms might imply a seismic shift, but it’s not as if Sarcator sound like a completely different band. The sandwich is now (western-tinged) rock, but its wrapper is still youthful, abrasive, and—yes—blackened.

    Sarcator build this batch of tunes atop time-tested chord progressions, with Tervonen’s vocals tasked with cutting through the listener’s palette. For the most part, he delivers. The choruses on “In Search of Oblivion” and “Volatile Insight” hit the sweet spot between attitude and stickiness through deliberate spacing and cadence. Tervonen’s tongue trills are tantalizing, becoming a bit of a signature throughout. Not every song, however, strikes a salutary balance. “The Underground Streets” could pay off its guitar earworm with a stronger vocal hook, while “Bleeding Ages” is in need of memorability. Penultimate country rocker “Wasteland Strider” tosses a vocal curveball, containing clean singing before it gets death n’ rolling. It’s a jarring change that, while well executed, feels a little like variety for variety’s sake this late in the album. Production-wise, Tervonen’s voice is a bit more prominent in the mix than I’d like, at the expense of melodic support from the bass.2 But overall, The Ones We Follow sounds open and punchy, with Tervonen’s voice commanding deserved attention.

    While not their longest meal, The Ones We Follow pits a girthy album length against a mostly immediate vibe. Shorter songs like “The Ones We Follow” and “You Gotta Possess Me” kill it, kicking in the door with controlled chaos. The clash between immediacy and girth, however, reveals itself mostly in the album’s epics. Seven-minute centerpiece “Rotting Chapels” implies scope with its key-changing buildup, but it ends up sounding like a longer version of the abrasive surf rock heard earlier. Meanwhile, closer “Wanderlust” epitomizes its title, wandering from mid-paced cowboy bumps to “Hot for Teacher”-style fretboard gymnastics and harmonica-sweetened blues dirt. It’s highly entertaining stuff, skirting the line between jamming and riff salad-ing. The album’s 50 minutes may look long on paper, but there’s enough head-turning developments to keep things interesting. The Dire Straits-y ending to “Rotting Chapels” comes to mind, as does the brush-fueled gallop in “Bleeding Ages.”

    Leaving me a little hungry at first, The Ones We Follow ultimately won me over with its blackening of a more rustic protein. I applaud Sarcator for daring to change, and there’s lots of tasty stuff on here, with nothing off-putting. Still, The Ones We Follow could elevate its addictive attitude and classic songwriting with more vocal hooks and judicious editing. What crystal clear, however, is that the members of Sarcator are having a hell of a lot of fun here, rocking out and experimenting in equal measure. I’ll continue following these Swedes in the future, as they show signs of following The Ones We Follow with something seriously sumptuous.

    Rating: 3.0/5.0
    DR
    : 9 | Format Reviewed: 320 kbps mp3
    Label: Reigning Phoenix Music
    Websites: Bandcamp | Instagram | Facebook
    Releases Worldwide: October 30th, 2026

    #2026 #30 #BlackenedThrashMetal #DeathMetal #DireStraits #Hellripper #Oct26 #ReigningPhoenixMusic #Review #Reviews #Rock #Sarcator #ShadowyMenOnAShadowyPlanet #SwedishMetal #TheOnesWeFollow #ThrashMetal #Wayfarer
  30. You shipped the feature, fixed the bugs, and answered the "quick question" that turned into a two-hour debugging session. The invoice went out on the first of the month. Thirty days later: nothing.

    The most I have ever waited on was $4,800. The client answered every message within a day - "accounts is processing it", "the approver is on holiday", "next Friday, promise". What got it paid was not a longer or angrier email. It was the third email in a sequence I already had sitting in my drafts folder, sent on day 30, worded almost exactly like the one below. The money arrived in 48 hours.

    If you freelance or run a small dev shop, chasing payment for finished work is one of the worst parts of the job. The fix is not a better apology for asking. It is a process: the same three emails, on the same days, every time.

    Here they are, copy-paste.

    Day 7: the polite nudge


    At seven days past the due date, assume a boring explanation. The invoice was missed, routed to the wrong person, or stuck in an approval queue. Your goal is a response without friction.

    Subject: Quick follow-up on invoice #[NUMBER]

    Hi [CLIENT NAME],

    I'm following up on invoice #[NUMBER] for [PROJECT/DELIVERABLE], which was due on [DUE DATE].

    Could you confirm that it's been received and let me know when I can expect payment?

    For reference, the outstanding amount is [AMOUNT].

    Thanks,
    [YOUR NAME]


    Why this works: you identify the invoice, state the amount, and ask for one specific next step. No accusation, no essay.

    Send it in the original invoice thread so the context travels with it. If they reply with a payment date, write it down. A promise in a casual email is easy to forget - yours and theirs.

    Day 14: the firm follow-up


    Two weeks late, be more direct. This message says the balance needs attention; it does not ask whether anyone saw your last email.

    Subject: Payment overdue - invoice #[NUMBER]

    Hi [CLIENT NAME],

    Invoice #[NUMBER] for [AMOUNT] was due on [DUE DATE] and remains unpaid.

    Please confirm the scheduled payment date by [RESPONSE DEADLINE].

    If payment has already been processed, please disregard this reminder and let me know so I can update my records.

    Thank you,
    [YOUR NAME]


    Why this works: it replaces a vague request with a clear action and a deadline, and it gives the client an easy out if payment is already moving.

    Set the response deadline at two business days. If the answer is "waiting for approval," ask when approval is expected. If "accounting pays on Fridays," ask which Friday your invoice is scheduled for. Turn "we'll get to it" into something you can track.

    Check your contract before this email. If it allows late fees, interest, or pausing work, know the terms before you invoke them. Never add fees the contract does not mention.

    These templates are communication examples, not legal advice. Check your contract and applicable local law before adding late fees or taking collection action.

    Day 30: the final notice


    A month overdue changes the conversation. Stay polite, but do not send a third email that sounds like the first one.

    Subject: Final payment notice - invoice #[NUMBER]

    Hi [CLIENT NAME],

    Invoice #[NUMBER] for [AMOUNT], originally due on [DUE DATE], remains outstanding despite my previous follow-ups.

    Please arrange payment in full by [FINAL DEADLINE] or contact me by that date to confirm a concrete payment arrangement.

    If the balance remains unpaid and I have not received an agreed resolution, I will consider the next steps available under our agreement and applicable law, which may include formal collection or recovery proceedings.

    Please confirm receipt of this notice.

    Regards,
    [YOUR NAME]


    Why this works: it is factual, it documents the history, and it sets an explicit deadline without threats you cannot carry out.

    Only name actions you are genuinely prepared and legally entitled to take. Before formal recovery, review your agreement, preserve the invoices and correspondence, and check the rules in the relevant jurisdiction. And do not assume you can shut down a live service, revoke access, or withhold source code - your contract decides that, not your frustration.

    What happens between the emails matters as much


    1. Keep a payment log. Invoice number, amount, due date, reminder dates, responses, promised dates. The day you have three late invoices, this log is the only thing keeping the story straight.
    2. Separate payment from new work. A client who has not paid asking for another feature is not an automatic yes. Review the agreement and discuss a pause or revised schedule.
    3. Make paying easy. Every email includes the invoice, the amount, payment instructions, and the reference their accounting needs. Every extra step is another week.
    4. Fix the next contract. Explicit payment terms, a defined invoicing schedule, a stated late-fee rule. For larger projects, milestone payments instead of one big invoice at the end.
    5. Do not let one client be your whole business. A great relationship is still a financial risk if one unpaid invoice stops you paying your own bills.


    Build the system before you need it


    The best time to decide how you handle late payment is before an invoice goes overdue. Set three calendar reminders for days 7, 14, and 30, save the scripts as templates, and when the day comes you fill in the brackets and send. You follow a process instead of writing an email while frustrated.

    Your turn: what is worse - clients who ignore reminders, clients who keep promising "next week," or clients who dispute the invoice after the work is done? And what actually worked for you?

    Written by the Change Brief team - we build practical, no-signup toolkits for freelancers.

    AI assistance was used in drafting this article. The publisher reviewed and edited the content and takes responsibility for the final version.#freelance #career #productivity #software #coding #development #engineering #inclusive #community
    3 Late-Payment Emails for Freelance Developers

Share on Mastodon

Enter the server where you have an account.