from PlantLab.ai | Blog

Three antique botanical study plates side by side - two vigorous cannabis specimens and one with drooping, ochre-faded lower leaves - above a fine ink rule punctuated with engraved tick marks like a season of logged entries

The Short Version

Between June and August 2026, PlantLab learned to diagnose several plants in one photo, started naming the family of a condition when it isn't sure of the specific name, made model upgrades visible to your code, and fixed an upload failure that took three tries to actually kill.

The middle two change what comes back in your JSON.

I don't write these often. Most of what happens on a project like this isn't worth a post, and I'd rather publish something useful about spider mites than a changelog with a bow on it. But enough landed this summer to be worth one place to see it, and the failures are more interesting than the features.


One Photo, Several Plants

The API used to assume your photo held one plant. Shoot a whole tent and it averaged everything into one answer for the room, which is the wrong answer for every plant in it.

It now finds each plant separately and returns a results array – one entry per plant, each with its own bounding box, health call, growth stage and conditions. Three plants, two fine and one yellowing, gets you exactly that, and the box tells you which pot to walk to.

This was a breaking change: the per-plant fields moved off the top level into results[]. A single-plant photo returns an array of one, so it's the same code path either way. There's a longer write-up if you're wiring it up.


It Admits When It's Unsure

The change I'm happiest with, and the least flashy.

Some plant problems look nearly identical in a photograph. Calcium and magnesium deficiencies need different fixes, and there are images where nothing in the RGB data cleanly separates them. The honest move there isn't to pick one and sound confident.

So every condition and pest now carries a coarse_group – the clinical family it belongs to, one of six. The family is often right when the specific name is shaky, so you can alert on “something in the mobile nutrient family is happening” and stand on much firmer ground than “it's definitely magnesium.”

A secondary finding can also come back marked suspected: true. That flags something for your attention without claiming it. Show those to a human. Don't dose on them.

Both fields are additive, so nothing broke when they appeared.


Model Upgrades Are Visible Now

Responses carry an engine_version naming the build and model iteration that served your call.

That matters because the models behind a diagnosis were replaced over the summer, and they'll be replaced again. If you cache results or tune thresholds against particular behavior, watch that field and invalidate when it moves. It used to be that a model upgrade quietly changed things underneath you. Now you can branch on it.

The honest numbers haven't moved much and I won't inflate them: cannabis verification sits at 99.96% balanced accuracy, health screening at 98.4%, both on plants held out from training. Naming the exact condition is still harder than noticing something's wrong. That gap is why the hedging fields exist.


The Upload Bug That Took Three Tries

My favorite failure of the summer.

Uploads from phones started failing. Not all of them, not reproducibly, and never on my machine. The pattern turned out to be full-resolution photos over slow upstream connections – which describes a lot of growers and almost no developers.

The server was hanging up while the phone was still sending. I raised the read timeout from 30 seconds to 120 and shipped it. Reports kept coming. Raised it to 300 and shipped that. Reports kept coming.

There were three timeouts in that path, not one, and they were all different: the API's own, the reverse proxy in front of it, and the client's. Fixing one just moved the failure to whichever was now shortest. The connection died at the tightest link no matter what I did to the others. Aligned all three at 300 seconds and the reports stopped.

I shouldn't have needed this lesson twice: when a timeout fix doesn't work, the timeout you fixed isn't the one that fired. Find every layer that can hang up before you touch any of them.

The mobile app shipped with the aligned values in July.


Quieter Things

  • The API no longer dies at boot on a transient database hiccup. It used to try once and exit, so a DNS blip during a deploy could take the service down until someone noticed.
  • There's a partners page now for hardware and platform companies who want plant health inside their own products.
  • /usage returns your counts, limits and remaining quota, and doesn't itself consume quota.
  • I measured what ruins a diagnosis photo. Tight close-ups and overexposure hurt far more than blur or purple light, which is the opposite of what most people assume.
  • Infrastructure runs in Europe. That happened earlier in the year, and here's why.

What's Next

More work on naming the specific condition rather than the family, since that's the honest weak point and everything else is downstream of it. And better handling of the photos growers actually take, which are lit by purple LEDs at midnight rather than by a photographer.

Free tier is 3 diagnoses a day, no card. The full contract is at plantlab.ai/openapi.json, with a field-by-field walkthrough if you want it, plus guides for Home Assistant and Node-RED.

 
Read more...

from PlantLab.ai | Blog

A herbarium specimen sheet in antique botanical style - a pressed cannabis leaf drawn in fine engraved ink on the left, joined by a single ruled line to a naturalist's record card of neat abstract pen strokes on the right

What It Does

The PlantLab API takes one image of a cannabis plant and returns structured JSON describing what's wrong with it: one of 30 conditions and pests (or healthy), a growth stage, a confidence score on every call it makes, and a bounding box per plant when the photo has more than one. It answers in about 18 milliseconds. Auth is a single X-API-Key header, and the free tier is 3 diagnoses a day without a card.

If you already have a camera pointed at your tent, this is the piece that turns a JPEG into something your automation can branch on.

Most grow stacks are blind in the same place. Temperature, humidity, VPD, EC, runoff pH, substrate moisture at three depths – all of it describes the room, none of it describes the plant. So the loop still ends at a person squinting at a phone.

Every response below came out of the live engine.


One Call

curl -X POST https://api.plantlab.ai/diagnose \
  -H "X-API-Key: $PLANTLAB_API_KEY" \
  -F "image=@canopy.jpg"

Multipart upload, one required field.


What Comes Back

A real response, from a plant with powdery mildew on it:

{
  "request_id": "8919a46e-a704-4a4e-a700-b754188165b5",
  "schema_version": "3.1.0",
  "engine_version": { "api": "1.0.166", "models": "v6" },
  "success": true,
  "is_cannabis": true,
  "cannabis_confidence": 0.95,
  "results": [
    {
      "bbox": { "x0": 0, "y0": 0, "x1": 1, "y1": 1, "normalized": true },
      "is_healthy": false,
      "health_confidence": 0.1,
      "growth_stage": "vegetative",
      "growth_stage_confidence": 0.9,
      "conditions": [
        {
          "class_id": "powdery_mildew",
          "display_name": "Powdery Mildew",
          "confidence": 0.8,
          "coarse_group": "fungal_disease"
        },
        {
          "class_id": "potassium_deficiency",
          "display_name": "Potassium Deficiency",
          "confidence": 0.6,
          "suspected": true,
          "coarse_group": "mobile_nutrient"
        }
      ]
    }
  ]
}

It returned two things. The mildew is the call it's making. The potassium deficiency is marked suspected – something else worth a look, without claiming it.


The Fields

Field Level What it means
is_cannabis image Whether the photo is cannabis at all. Decided first, so it sits at the top
cannabis_confidence image Probability the image is cannabis
results[] image One entry per detected plant. A single-plant photo returns an array of one
bbox plant Where this plant is, in normalized 0-1 coordinates. Multiply by width and height to draw it
is_healthy plant The health call for this plant
health_confidence plant Probability the plant is healthy. Read the next section before using it
growth_stage plant seedling, vegetative, or flowering
conditions[] plant Diseases and deficiencies, most confident first
pests[] plant Pests, same shape
schema_version response Contract version, currently 3.1.0
engine_version response The build and model iteration that served this call

The field people get wrong

health_confidence is the probability the plant is healthy. It isn't confidence in the verdict you were just handed.

In the response above, is_healthy is false and health_confidence is 0.1. That's not a shaky answer – it's a very confident sick one, because a 10% chance of healthy is a 90% chance of not. Write if health_confidence < 0.5: flag_uncertain() and you'll fire uncertainty warnings on the clearest sick plants you own while staying quiet on the genuinely ambiguous ones.

When is_healthy is false, low health_confidence means more certain, not less.

suspected and coarse_group

suspected: true marks a secondary finding the engine wants to flag but isn't asserting. Show it to a human; don't dose on it.

coarse_group is the clinical family a condition belongs to – one of mobile_nutrient, immobile_newgrowth, water, light, fungal_disease, pest. Some problems genuinely look alike in a photograph, and the family is often right when the specific name is shaky. If you're deciding whether to alert rather than what to dose, group on this instead.

Also in the response

Three more fields show up when they apply.

mulders_hypotheses names nutrient excesses that would explain the deficiency you're looking at. A calcium excess locking out nitrogen looks exactly like a nitrogen shortage, and feeding more nitrogen makes it worse.

progression_risks says what this turns into if nothing changes.

stage_advisories adds context that depends on the plant's stage. Lower-leaf yellowing in late flower is usually normal, and it says so rather than letting you chase it.


The Rest of the Surface

Endpoint Method Purpose
/diagnose POST The one you came for
/usage GET Current counts, limits, remaining quota. Read-only, doesn't consume quota
/health GET Liveness. No key required
/info GET Metadata and capabilities
/history GET Past diagnoses, newest first. Pro tier and above, with data sharing enabled
/feedback POST Report a wrong result

/usage is the one integrators forget exists and then rebuild badly. Poll it instead of counting your own calls.

The full machine-readable contract is at plantlab.ai/openapi.json, so generate a client rather than hand-rolling one.


Limits and Errors

Free tier is 3 diagnoses a day. No card, no trial clock, and nothing to cancel – paid plans aren't live yet, so right now that's the whole offer. Higher-volume tiers exist in the API for granted accounts, and paid access is coming.

429 means you hit a limit. 408 means inference timed out. 400 on upload usually means the image failed a sanity check rather than a malformed request.


What It Doesn't Do

It's cannabis-specific. Point it at a tomato and is_cannabis comes back false, which is correct and not useful.

It reads a photograph, so it's bounded by what a photograph contains. Root-zone problems only appear once they reach the leaves, and two conditions that look identical in RGB are hard to separate in RGB. That's why suspected and coarse_group exist instead of a single confident label.

It's sensitive to how you shoot. Overexposure and tight close-ups reliably produce wrong answers – I measured what breaks a diagnosis, and the results aren't what most people guess.

It doesn't replace looking at your plants. It notices things earlier and more consistently than you will at 11pm, and it never gets bored.

On accuracy: cannabis verification runs at 99.96% balanced accuracy and health screening at 98.4%, both on plants held out from training. Naming the specific condition is a harder problem than deciding something is wrong, which is the honest reason those hedging fields are in the response at all.


Getting Started

Sign up at plantlab.ai, copy your key from the dashboard, and run the curl command at the top of this post against one of your own plants.

Prefer wires to code? There are guides for Home Assistant and Node-RED.

 
Read more...

from PlantLab.ai | Blog

An antique bellows plate camera on a tripod studying a cannabis specimen framed by hand-inked corner brackets, with two faded rejected alternatives in the corners: the plant lost in an oversized frame, and a single leaf overflowing a too-tight crop

How to Photograph a Cannabis Plant for Diagnosis

Frame the whole plant so it fills most of the shot, and use even light that isn't blown out. Don't zoom in on the damaged leaf, and don't shoot from across the tent. If your lights are blurple, that matters far less than whether the photo is overexposed.

The mistakes that cost you most aren't the ones people expect.

The One That Surprises Everyone

When a leaf looks wrong, your instinct is to get close and photograph the damage. It feels like helping.

It's the most reliable way to get a wrong answer.

I took four labeled images – powdery mildew, spider mites, a nitrogen deficiency and a calcium deficiency – cropped each one tight around the affected area, and ran them through. Not one survived. The mildew came back healthy. The spider mites came back as a nitrogen deficiency. The calcium deficiency came back as septoria. The nitrogen crop wasn't recognized as cannabis at all.

Diagnosis is comparative. Which leaves are affected, old growth or new. Whether the pattern is uniform or between the veins. How the rest of the plant looks by comparison. A close-up throws all of that away and leaves a patch of discolored green that could be six different things.

Photograph the plant. The damage is already in the photo.

But Don't Go Too Far Back

The opposite mistake fails just as reliably. Shot from across the tent, all four went wrong: two returned the wrong condition, one came back healthy, and one wasn't recognized as cannabis at all.

There's also a hard floor on size. Scaled to 256 pixels wide, three of four failed the cannabis check outright and returned nothing. Any modern phone clears this easily, so it only bites when something in your pipeline resizes before upload. If you're automating, send the original.

One plant, filling most of the frame.

Light Level Beats Light Color

Overexposure is the dangerous failure, because it doesn't look like one.

Brightened until the highlights clipped, two of the four sick plants came back healthy with reasonable confidence. Blown-out highlights wash out the exact color and texture differences a diagnosis rests on, and what's left looks like an untroubled plant. You get an all-clear on a plant that needs attention, and nothing in the response tells you to doubt it.

Underexposure is gentler. Two of the four darkened images kept the exact right answer; of the other two, one dropped out of the cannabis check and one named the wrong pest. Neither returned a false all-clear. Wrong, or refused outright, you can recover from. Confidently-healthy you can't.

Blurple light did less damage than expected – three of four still returned the correct condition under a heavy magenta cast. That's smaller than the effect of exposure. It still costs some confidence, so shoot during a lights-off window or use your flash when that's easy. When it isn't, shoot under the grow lights anyway and watch the confidence score.

I simulated that color cast digitally rather than photographing under real fixtures, so it's directional rather than settled.

Blur Is More Forgiving Than You Think

A heavy blur kept the correct diagnosis on half the test images. On the other half it produced a wrong answer, with confidence collapsing to 0.10 and 0.15.

That's the system working. When the image doesn't support a call, confidence drops instead of the answer quietly getting worse. Treat anything under about 0.3 as “take another photo,” not as a diagnosis.

The reverse doesn't hold. A high score is not a guarantee: one tight crop returned the wrong condition at 0.70. Low confidence reliably means don't trust it. High confidence doesn't reliably mean you can.

Still focus your shots. But given the choice between a slightly soft photo of the whole plant and a razor-sharp photo of one leaf, take the soft one.

The Checklist

Do Why
One plant, filling most of the frame Diagnosis is comparative – it needs the whole plant
Even light, no blown highlights Overexposure returns false healthy calls
Shoot lights-off, or use the flash Costs less confidence than shooting under blurple
Send the original file Aggressive downscaling breaks the cannabis check
Retake anything under 0.3 confidence Low confidence often means the photo, not the plant
Avoid What happens
Close-up of the damaged leaf Wrong answer or a false healthy, every time
Whole-tent wide shots Wrong answer, or not recognized as cannabis
Brightening a dark photo to “fix” it Turns a diagnosable photo into a healthy verdict

How I Tested

Four labeled images – powdery mildew, spider mites, nitrogen deficiency, calcium deficiency. Eight versions of each: original, darkened, brightened, blurred, color-cast, tightly cropped, shot-from-distance, downscaled. Thirty-two diagnoses. All four originals returned the correct condition untouched.

The variants were made digitally rather than by re-photographing under each condition. And four plants is four plants: enough to show a pattern that held every time, not enough to put a percentage on it. Hence directions rather than numbers.

If You're Automating

Same rules, plus two. Don't resize before upload. And branch on confidence instead of treating every response as equally solid – under 0.3 usually means trigger another capture, not raise an alert.

The Home Assistant and Node-RED guides cover the wiring, and the API walkthrough covers what comes back.

Try it on your own plants at plantlab.ai – three diagnoses a day, free, no card.

 
Read more...

from Blog of Sand

Starcraft Co 5- Nature Preserve

This mission involved hunting ultralisks in a planet dedicated as a nature preserve.


The contract came from the Elysian Conservancy, a planetary trust responsible for maintaining one of the sector's largest privately managed nature preserves. The planet, Ardea, had no permanent cities, no mines and almost no industry. Its single orbital station existed primarily to receive researchers and wealthy tourists willing to pay obscene amounts of money to spend two weeks looking at animals from behind polarized glass. Almost ninety percent of the surface was protected wilderness. The Conservancy's promotional material described it as one of humanity's great conservation successes. The financial records described something less romantic: declining donations, deferred maintenance, aging equipment and a government subsidy that hadn't increased in eleven years. Now something was eating the wildlife.

“We thought they were isolated incidents at first,” Director Halden explained. Satellite images appeared beside him, showing enormous carcasses scattered across a grassland. “Our larger herbivores migrate. Animals die. Scavengers strip the remains. It took several weeks before anyone realized the pattern.” The commander enlarged one image. Something had torn an animal the size of a terrestrial elephant nearly in half. “Ultralisk?” Halden nodded. “Confirmed twelve days ago.” The commander moved to the next image. “One?” Halden hesitated. “No.” The current estimate was eighteen to twenty-five animals, although nobody could say where they had come from. That uncertainty was becoming familiar. There was no established Zerg hive on Ardea, no recorded infestation and no reason for a population of ultralisks to exist there. Yet they were spreading across several hundred kilometers of preserve, devouring virtually every large animal they encountered. Halden's people estimated that another month of predation could permanently damage several already-fragile populations.

“Call the military,” the commander said. Halden explained that they had. The military's proposed solution involved aerial reconnaissance, armored forces and authorization for orbital strikes if the infestation proved larger than expected. “Which would solve your ultralisk problem.” Halden nodded. “By turning approximately twelve thousand square kilometers of protected habitat into a military operations zone.” There was another problem. Ardea couldn't afford it. The Conservancy wanted the ultralisks removed cheaply, with as little disturbance as possible and preferably without tourists learning that enormous Zerg organisms were currently eating their way through the planet's most famous wildlife reserve. No battlecruisers. No tanks. No orbital bombardment. Even aircraft were restricted around several sensitive nesting regions. StarCraft Co. had begun receiving contracts precisely because it had developed a reputation for solving problems without destroying everything surrounding them.

The commander studied the proposed fee and named a higher one. Halden protested that the Conservancy was a nonprofit. The commander pointed out that ultralisks did not offer nonprofit rates. They eventually found a number both could tolerate. Compared with the Horizons Beyond contracts, the money wasn't extraordinary. The opportunity was. StarCraft Co. had spent much of its existence fighting in corridors. Ardea would prove whether it could operate as a genuine field force. The deployment reflected what the company had learned. They didn't flood the planet with cheap infantry. Several detachments of experienced marines landed with dedicated medic support, carrying upgraded rifles and armor-piercing ammunition purchased specifically for the contract. Every squad carried tracking equipment, remote cameras and enough supplies to remain in the field for days. They weren't there to fight twenty ultralisks. They were there to fight one ultralisk twenty times.

The first hunt took almost fourteen hours. Conservancy trackers followed a trail of destroyed vegetation into a broad valley where one of the creatures had been feeding on a herd of six-legged grazers. The commander refused to let the marines approach until they understood the terrain. They spent three hours placing firing positions along a rocky slope overlooking a narrow ravine. One squad eventually descended far enough to attract the ultralisk's attention, fired several rounds into its hide, then ran. The animal followed. The scale of it was difficult to appreciate until it was moving toward them. An ultralisk outweighed a marine by roughly two hundred times. Its armored body shook the ground as it charged, enormous kaiser blades cutting through vegetation that would have stopped a vehicle. The bait squad barely reached the ravine before the creature caught them. Then armor-piercing fire erupted from both slopes.

The rounds worked. Not quickly, but they worked. Marines fired into joints, eyes and the softer tissue beneath the creature's armored plates. The ultralisk tried climbing toward one firing position, forcing that squad to withdraw while the others continued shooting into its exposed flank. It changed direction. Another squad retreated. The creature spent nearly five minutes chasing enemies it could never quite reach while concentrated fire gradually tore it apart. Eventually one foreleg buckled. The ultralisk collapsed against the ravine wall and still tried to rise. The marines continued firing until it stopped. Nobody celebrated much. They had used almost three times the ammunition projected for a single kill.

The second went more smoothly. The third nearly killed eight people when it abandoned the bait squad and charged directly through a patch of forest the commander had assumed was impassable. Trees snapped in front of it like grass. Marines scattered while medics dragged one man with a shattered leg behind a boulder seconds before the ultralisk reached him. It took concentrated fire from three directions to bring the creature down. Afterward the commander revised every terrain assumption on the operation map. If an ultralisk could physically fit between two objects, the route was considered passable. By the fourth hunt, the mercenaries had developed a system. Scouts located an animal and tracked it without engaging. The commander selected terrain that limited its movement. Firing teams established positions before anyone deliberately attracted its attention. Marines never tried to hold ground. If the ultralisk chose their position, they withdrew while everyone else fired. The object was not bravery. The object was making several tons of enraged Zerg repeatedly turn around while armor-piercing rounds accumulated inside it.

It worked until the sixth ultralisk. The creature had been tracked into a canyon bordered by dense woodland. Everything indicated it was alone. The first shots struck exactly where intended, and the ultralisk charged toward the bait squad. Then trees began falling behind the western firing position. A second ultralisk emerged. There was no time to withdraw cleanly. The second animal hit the flank before the marines could reposition, catching one squad in the open. Its first sweep killed two men. Another marine disappeared beneath one of its feet. The formation fragmented as both creatures charged independently through the canyon. Fire discipline vanished. Squads fired at whichever target was closest while medics tried to reach wounded personnel without being crushed.

The commander stopped trying to control the entire battlefield and divided it instead. Half the force concentrated on the original ultralisk while the rest drew the second away. The first was already wounded. Every available rifle focused on one foreleg until the limb finally failed. The creature crashed forward, carving a trench through the earth with its blades, and the marines poured AP rounds into its exposed underside until it died. Then everyone turned on the second. It took another eleven minutes. When it was over, six ultralisks lay dead across Ardea. So did too many mercenaries. The commander requested reinforcements.

A dropship arrived the following morning carrying fresh marines, ammunition and replacement medical supplies. The new soldiers walked past stretchers heading in the opposite direction. Nobody needed to explain what they were hunting. The operation continued. Most of the remaining ultralisks were successfully isolated. Some were drawn into rocky gullies where they could not maneuver effectively. One was lured onto marshy ground and sank deep enough that its enormous mass became a liability. Marines stood outside the mud and methodically shot it to pieces while it struggled to free itself. Another was tracked into a forest recovering from an old wildfire, where the mercenaries used fallen trunks and steep terrain to force it through a winding route while firing from elevated positions.

Not every plan survived contact. Twice more they encountered pairs. The first pair cost them four marines. The second almost destroyed an entire detachment when one ultralisk circled around a ridge instead of following the expected route. A medic spotted it first and screamed a warning seconds before it hit. The squad scattered. Two weren't fast enough. Every casualty taught them something. They learned how ultralisks turned. They learned which movements preceded a charge and which meant the creature was preparing to change direction. They learned that damaging one leg was more useful than spreading fire across the entire body. They learned to place medics where terrain prevented a direct charge. They learned never to trust forests, never to trust ridgelines and never to assume the creature they could see was the only creature nearby.

Most importantly, they learned patience. Some hunts lasted days. StarCraft Co. would locate an ultralisk and simply follow it. Marines slept in shifts while drones and trackers maintained contact. They waited until the creature entered favorable terrain. Sometimes it took six hours. Sometimes twenty. Once they tracked an animal for nearly three days before it wandered into a dry river system narrow enough to create overlapping fields of fire. Then they killed it in seven minutes. The Conservancy initially worried that the operation was moving too slowly. The commander showed Halden the casualty projections for attacking the creatures wherever they happened to be found. Halden stopped asking.

Weeks passed. The numbers accumulated. Nine. Twelve. Fifteen. Eighteen. The surviving marines became extraordinarily good at killing something that should have been able to tear a squad apart. New arrivals learned from veterans. Squads that had once panicked when an ultralisk changed direction began reacting almost automatically, peeling away from the charge while adjacent units shifted fire toward exposed joints.

The final hunt began near dawn. Two ultralisks had been tracked into open savanna together. Separating them proved impossible. Whenever one moved, the other followed. The commander considered waiting another day, then another, but reconnaissance suggested the animals were approaching one of Ardea's largest remaining herds of native grazers. They would have to take both. The mercenaries prepared the ground through the night. Marines dug shallow firing positions behind natural stone formations. Ammunition caches were distributed so no squad would need to carry its entire supply. Medics established two treatment stations on opposite sides of the engagement area. The commander divided the force into independent teams and gave each the same instruction: once the ultralisks committed, nobody tried to stand against them.

At sunrise, the bait team fired. Both ultralisks charged. The savanna erupted. Armor-piercing rounds struck the lead creature from three directions. It turned toward one squad, which immediately withdrew. The second ultralisk continued straight and forced another team from its position. For several minutes the entire battle became movement—humans scattering between rocks while the two enormous creatures tried to close the distance. Then one marine stumbled. The ultralisk reached him before anyone could help. Nobody stopped firing. The commander concentrated every squad with a clean angle onto the creature's right foreleg. Hundreds of rounds struck the same region. Armor fractured. Tissue shredded. The limb collapsed.

The ultralisk went down. The second charged directly through the firing line trying to reach the wounded animal. Three more marines died. Then the surviving squads surrounded it. The first ultralisk was still alive, dragging itself forward with its remaining limbs. A marine squad finished it while everyone else concentrated on the second. The last ultralisk on Ardea died less than twenty meters from the first.

When the Conservancy completed its final aerial survey, twenty-three ultralisk carcasses were marked across the preserve. Twenty-three. The photographs were absurd. Marines standing beside the bodies looked like children posing beside construction equipment. Some of the creatures were nearly two hundred times their mass. StarCraft Co. had killed them with rifles. The cost had been substantial. The company had lost enough experienced personnel that the commander immediately suspended new deployments until replacements could be trained. Medical bills were enormous. Ammunition expenditures had consumed a surprising portion of the contract. The Conservancy quietly paid an additional casualty allowance after seeing the final report.

But Ardea's herds survived. There were no orbital craters. No forests flattened by tanks. No ruined ecosystems. Most visitors never learned anything had happened. Director Halden thanked the commander personally. More importantly, he talked. So did the Harrier survivors from the Horizons Beyond. So did Kessler. So did the executives of the research corporation. People who needed unpleasant problems solved quietly began passing around the same contact information.

By the time StarCraft Co. returned from Ardea, the commander had forty-three pending contract requests. Some were ordinary security work. Several involved missing settlements. Others described unexplained Zerg sightings on worlds with no known hives. A mining consortium wanted help clearing hydralisks from an asteroid complex. A colonial government had lost contact with an agricultural district. Two shipping companies reported organisms aboard cargo vessels. Someone claiming to represent a planetary governor wanted an infestation removed without notifying the military. The commander read through them late into the night.

Individually, none seemed extraordinary. Taken together, they were impossible to ignore. The Varga laboratory had seemed like an accident. The Horizons Beyond had seemed negligent. Ardea could have been another isolated outbreak. But the requests kept arriving. Different planets. Different corporations. Different circumstances. The same problem. StarCraft Co. was becoming successful faster than anyone had expected. Unfortunately, it was beginning to look like there was a reason.

 
Read more...

from blog//x2600.cc

The train sings outside, clouded sky shrouds the “dark valley” it travels through. The night is continued by dark clouds, the rain, on and off as the morning moves on.

A coffee is poured, then another. The third one cools as I write on my phone.

82Mhz shared amazing links this AM, how to make a server on an Android phone, AI destroying books, other ephemera to read through the day

I light a cigarette and retreat to water

 
Read more...

from Jaran Flaath

– Det er viktig å skape nye historier, sa han. – Ikke bare leve på de gamle.

Det var kjøreskolelæreren min som skulle vise seg å bidra med den største innsikten jeg har blitt servert på en god stund. Han er 70 år, har kjørt motorsykkel lengre enn han kan huske, og har ingen planer om å gi seg før kroppen streiker. Det er hans måte å skape de historiene han vil leve. Det var dypt inspirerende der vi satt i salen og nøt svinger og landskap om hverandre.

Det er lett å bli hengende ved de gamle historiene, leve på dem hver dag. Man lar de definere en selv og ender ofte opp med å gjenfortelle gang på gang når man sitter rundt kaffekoppen med kamerater eller kollegaer.

Samtidig er det lett å tenke at alle nye historier må være store, må stadig overgå. At de må være grandiose og imponere. Det har ikke jeg tid eller mulighet til, kan man tenke.

Det er lett å tenke på livet som det som har skjedd, det man har opplevd. Men det er vel så mye det som gjenstår å oppleve. Historiene man ikke har skapt, som ligger der og venter. Ikke som en uoverkommelig bucket list, eller et jag etter å leve hver dag som den siste, men som en motivasjon og noe som kan skape glede og forventning. Noe å se frem mot heller enn å bare kikke i bakspeilet.

Det kan være vel så verdifullt med de må hverdagseventyrene som de store som bare skjer en gang i tiåret. Forsøke noen nye hobbyer. Gå nye stier i skogen – ta med middagen. Ta badstue med noen kamerater. Kjør motorsykkel. Spill frisbeegolf, eller vanlig golf. Eller begge deler. Lær deg å strikke. Hopp i fallskjerm.

Historier kan være så mangt og det viktige er å lage deg noen du kan leve, ikke bare fortelle de samme gamle om igjen.

 
Read more...

from Things Left Unsaid

Woke became an insult. What does it mean to be not woke? To oppose all the things that could bring humanity to a brighter future, like wisdom, common sense, empathy, acceptance, logic, education, science, etc.. Judge and hate people for the color of their skin, for who they fall in love with, for where they were born, or for no reason at all. Decide who should have and who should have not. Even when presented with solid evidence, deny that more of an iceberg exists beneath the surface than what can be seen. Life is all black or white with no in between. Don't listen to reason, and ignore any inclination to investigate anything. Cancel critical thinking. Don't care about how much suffering closed mindedness, greed and violence causes. Measure success by how much power and The Dollar Almighty a person has taken by manipulation, greed, or brute force. If you haven't achieved this (false) success for yourself, admire those who have, and elect them as leaders.

 
Read more... Discuss...

from An Open Letter

I have been getting a lot more matches on, and there’s this one person that I was talking to a lot today she really matches my energy. I also thought she was funny And she matched my freak. She also mentioned that she has had therapy in the past, and she lives pretty close by which I’m excited for. We have our first date on Saturday. I’m nervous but excited.

 
Read more...

from AnOublietteofThought

He did not settle upon my heart with the coziness of a warm blanket. He clawed his way through terror and rejection, roaring in silent defiance until I granted audience. Until I opened my eyes to see what stood before me.

It is said, that when the leaves blush in longing dance, air and water will unite to set flame to ways long rotting. What they forgot to mention is that the earth must tremble, cracking until mountains rise to spew fire into the heavens. Forever igniting our best minds to blaze in remorse. The unyielding storm holds no syllables in that passage.

Storms do not yield. They flood. They rupture. They clean the slate and leave a debris field of memories for us to learn from. But we haven't learned. Neither have I. Neither has he. We just are. Two victims of a cunning value. Little more. Little less.

We are taught that we must never gaze into the eyes of our heroes. One does not ascend to such great depths by doing what they are told. I dared to peer into the travesty of his gaze, and in that monumental moment of a not-so-insignificant contact—

the world tilted.

© 2026 AnOublietteofThought. All rights reserved.

 
Read more...

from Out of Office

WTF.

Today started out with the reminder that it may be my dogs last day. I am still not ready.

It was not quite as productive and busy yesterday. I can’t tell if that is a good thing or not, because I felt as if I had to fully acknowledge how I am feeling, which resulted in a lot of crying.

I could not eat this morning, the best I could do was a cup of coffee, which I hate taking on an empty stomach. I think I doomscrolled for a bit/started packing in short bursts of energy. It was weird. The energy was weird. The weirdest of all was my dog acting and looking completely fine and normal. It is disheartening and charming at the same time. Does she even know that I am just waiting for her to be ready? However, I have to leave in just a couple of days so I can’t wait any longer. My heart feels physically broken – like my chest physically hurts.

I am pulling every single string so I can have her for just one extra day.

It is too much. Everything happening right now is just too much.

To top it all of, I had an ATM machine malfunction on me on my last errand. Now I have to go to the bank tomorrow and get it sorted out because my deposit did not go through :/

Thank you for your message. I am currently out of office with no set return date. I will get back to you when the time is right.

 
Read more...

from Out of Office

Well, today was kind of busy ~ kind of sad.

Started with a bang at an oil change appointment. It was kind of annoying (another expense while having no paycheck), but also productive because I finally started writing my speech for my brother’s wedding!

Went to urgent care (finally) for my cough/congestion… only to be told it may be really bad allergies and to just continue taking allergy medicine.

Then I went to pottery and got quite a bit of work done with the trimming and stamping of a couple of pieces. All before heading to therapy for an hour. It was helpful, but man was it a lot to unpack this time.

Ran home, finished some laundry, and saw the dogs before going to a workout class! Continued on by another short pottery session of glazing a few other pieces with my mom. Proceeded to meet up with my dad and dogs at the dog park for what I have to assume is the last time (?!)

And finally, came home for the day.

Thank you for your message. I am currently out of office with no set return date. I will get back to you when the time is right.

 
Read more...

from The disconnect blog

I enjoy alt-media news much more than I ever really enjoyed mainstream media news. But something so strange happened during the whole Covid-19 thing. So many people got shadow banned during that event who were just being inquisitive and trying to find out what was going on. Legitimate doctors who were having successful results in treating Covid in many ways were harassed and even lost their licenses. As I watched all of this happen many alt-media lost a lot of their viewers because of being shadow banned or banned on Youtube, Facebook, Twitter, and probably more that I’m forgetting. Then some of them built back up on either their own platforms or other platforms. Now after all the dust has settled many are going back to their corrupt masters at Google and posting on YouTube. They talk about how they were banned and how lame the company is for doing that but still use it and post on it and funnel traffic to that beastly company. Isn’t this pretty much the definition of “selling out?” And all of us who disliked that whole thing, aren’t we selling out by still using the platform who thwarted free speech? I had Covid twice (untested cause I don’t trust the PCR test as viral diagnostics, neither did the inventor Kary Mullis. See a snippet article on the topic here and an open forum interview with him here skip to 48:30 to 52:11 for the reference about PCR testing, but the whole thing is interesting) and it wasn’t all that bad by taking vitamin C and D with zinc. Some doctors were harassed for saying such a thing, and that is known to help your immune system fight against just about any virus. I later learned that nicotine can help with long lasting Covid symptoms (and here). I did have decreased smelling for quite a while and got used to it. But after I heard about that I used a few nicotine patches cut up into small strips and nicotine gum. That gave me back a lot of my smell! Why won’t the main outlets give us at least the basics. Go get fresh air and sunlight for vitamin D, boost your vitamin C intake and make sure you have some zinc. That alone can keep many viruses from taking hold, and when they do they often will not be too debilitating.

Personally I have tried to avoid YouTube for many years now. There are some rare occasions that I do but I use it through third party platforms that block ads and hide my identity. I use a VPN, FreeTube, and/or PipePipe. I’ll switch to other things if/when those stop working. There is a constant little battle going on with YouTube trying to block those services and then those services get patched and they start working again. If I’m going to go use that platform which I dislike I’m not going to support them by watching their ads and letting them profile me. I’d rather not watch the video if I cannot do it on my own terms.

One of the biggest reasons I still ever go to YouTube is for the DIY and tutorial type videos. There are some decent alternative platforms for news, politics, and rantings of sorts but there isn’t much out there in the DIY and tutorial world besides YouTube that I have found. I would love a simple video site or video blog site to come along focused on that theme. Keep the bulk of the nonsense videos, politics, and compilations of silly animal events out, there are already plenty of platforms for that. If I had the ability and a bit more care that might be a project I’d put effort into. A simple clean DIY and tutorial video platform with no ads, just passion driven sharing of ideas. I wouldn’t block free speech with people posting a DIY video on something while rambling about their political views, but if it was just about politics I’d rather they go to Bitchute or something. A donation option would be cool and other payment options for content creators, but no ads and no paywall. That would be awesome!

Doesn’t this Proverbs 26:11 verse sort of fit with the people running back to YouTube after being banned?

Like a dog that returns to his vomit is a fool who repeats his folly

Proverbs is great.

Resources:

Books:

mRNA Vaccine Toxicity – by Dr. Michael Palmer M.D.

The Indoctrinated Brain: How to Successfully Fend Off the Global Attack on Your Mental Freedom – by Michael Nehls

Lies My Government Told Me: And The Better Future Coming – by Robert Malone, MD, MS

Apps and websites:

BitChute and Old BitChute — YouTube alternative focused more on freedom of speech.

Odyssey — YouTube alternative focused more on freedom of speech.

PipePipe — YouTube interface for Android and GrapheneOS that blocks your identity and ads.

FreeTube — YouTube interface for Linux, Mac, and Windows that blocks your identity and ads.

 
Read more...

from Blog of Sand

Gatsby got got

By my calculations The Great Gatsby is 305,729 characters. That's probably an overestimate, as it is the character count of the file from Project Gutenberg which has some extra text. Even still, we can use that number. This blog has reached 415,432 characters so it is approximately 136% of the Great Gatsby. A noteworthy achievement. I'm gonna take a beat before the next update like this. I'm thinking maybe War and Peace next. From there, many options. But I have a lot of projects in store so many potential posts coming down the pike. Just a few of them:

-Wrapping up the High Fantasy Swordfighter Tournament -More installments of Starcraft Co. -A bunch of D and D content -Various Musings

Stay tuned!

 
Read more...

from The Practice

On Learning To Write

Current Reading: Adler and How To Read A Book have officially been shelved. Saint Michaels Lent has started and I'll be reading The Spiritual Combat by Lawrence Scupoli as part of my devotion. I won't come back to Adler right away. I want to move on to something else, but I'll keep it close by for reference.


I've noticed my reading decline as of late. Im trying to become a better writer and it's really taking up a lot of my time just focusing on that. And I know that reading helps you become a better writer. But trying to write as much as possible to really get a feel for it, to try and find my voice is hard.

I was doing a lot of research on how people write differently. A lot of people have an idea in their head, plan it out and then write it down in the most elegant way they can. Some people write very analytical, almost like a very precise scientific explanation of something. Some write in beautiful pros, leading you down a beautiful literary narrative to a deeper understanding.

I write different I think.

Usually when I start I have no idea where I'm going to end up. That's what the Current Reading sections is for. It's something concrete I can start with, get my mind and hands working, then a thought will usually come up, and I start writing towards it.

I noticed this a couple years ago. I struggled to keep a steady journaling habit. I would make it two or three days then completely fall off. No real reason, just that I didn't have anything to write about. I think it's because I had an idea of what I was supposed to be doing. I thought I had to have a complete, fully formed narrative in my head before I started writing. I mean, that's what I was taught in school. Figure out what you're going to write about, make an outline, construct the essay. And that's a completely valid way of writing, but just not what I was wanting to do.

I'm Catholic. And every first Friday of the month my parish has overnight adoration. You can sign up to make a Holy Hour during the overnight hours into Saturday morning. I started going at 3 o'clock AM, and I really wanted to keep an adoration journal. But the same thing started happening, I'd get there, pray, open the journal and...crickets. Nothing coming to mind. No mystical messages from Our Lord beamed straight into my head. No big inspiration of anything I just had to get out.

So I started doodling, just because the pen and paper were right there in front of me. And then to my surprise, just by the mechanics of my hand moving, something loosened up, and a thought would just pop into my head. Something I was dealing with at work, something one of my kids had asked me, some problem I had been struggling with, some family dynamic that was needing to be worked out. And my hand started moving, but making letters and words this time not just drawing. Not in some flashy “a-ha” moment. Just natural.

I've now developed a pretty robust journaling habit. I've learned that I need to externalize my thoughts onto the page, to see them, so I can really understand them. I have also started a bullet journal and I still doodle.

And I know this may seem trivial to some people, but it was monumental for me. People think “Why are you making mountains out of mole hills Stoney. Just write something down”. And yeah for some that might work. I needed a little more understanding first. For years I wanted to journal steadily but it always evaded me. I just had to figure out the thing in my head holding me back, the way I was conceptualizing writing, was what I was taught in school. But it had to make sense in my own head for it to finally click.

And that brings me to the next big step. Trying to learn to write for others to read. It's something I've been drawn to my whole life. I never had enough confidence to actually do it, and I kinda can't believe I'm doing it now. I'm practicing in public(TERRIFYING). These short essays aren't going to be heavily edited. They are, at their core, my learning process. If you're looking for a completely polished, 3,000 word, journalistic masterpiece you probably won't find that here. At least not at first. The goal is to practice getting better. And I hope, eventually, that I'll write things that people enjoy reading.

 
Read more...

from Blog of Sand

High Fantasy Epic Sword Fighter Tournament Round 1, Fight 8

Xena, Warrior Princess vs Lancelot

Not all fights need to be prolonged. This one I think would end pretty fast. Xena Warrior Princess is well... if you aren't up to date on your early to mid 90s cheesy swords and sandals television epics, she is a reformed ruthless warlord who travels fighting evil to atone for her past, but she never loses her edge. Lancelot is one of the most famous knights in Arthurian legend. I could describe each more... but I don't feel like it. Research them if you are interested. Anyway, the final fight of the first round. Xena is hanging out in an old chapel and finds a cup to drink wine out of, unaware of its importance. Enter, Lancelot, questing for the Holy Grail.


Xena sat on the broken altar with one leg crossed over the other, drinking wine from an old cup she had found among the ruins. Hooves sounded outside, then an armored knight appeared in the chapel doorway. Lancelot stopped when he saw the cup in her hand. “Put down the Holy Grail.” Xena looked at the cup, then back at him. “This?” She took another drink. Lancelot drew his sword. Xena stared at him for a moment—and chuckled. “Oh, you're serious.” She set the cup beside her and stood. Lancelot advanced. “I will not ask again.” Xena drew her sword. “Good.”

Lancelot attacked beautifully. His first cut was fast, his second faster, and Xena turned both aside almost casually before slipping around the third. Lancelot pivoted to follow her and realized she was already inside his guard. Xena caught his sword wrist, drove her blade upward beneath his breastplate, and buried it through his chest. Lancelot stared at her in disbelief. “You really should've asked again.” Xena ripped the sword free and let him fall. She wiped the blade on his surcoat, retrieved the Grail, and frowned into it. Empty. “Great.” She tossed the holiest relic in Christendom onto Lancelot's chest and walked out.

Winner: Xena

And that ends the first round. Going forward to the next round:

Aragorn Jaime Lannister Maximus Beatrix Kiddo Lan Geralt Achilles Xena

I'm thinking we will do:

Aragorn vs Lan- Battle of Legends Maximus vs Jamie- Emperor Slayer vs King Slayer Beatrix Kiddo vs Xena- Boss Lady Battle Geralt vs Lan- Epic Fantasy Showdown

 
Read more...

Join the writers on Write.as.

Start writing or create a blog