Liza Shulyayeva

Snail Organs, Immunity, and Ageing

Organs! Immune systems! Old age! Dying from old age!

I’m super excited. I was thinking: “How do I implement old age and death, and health in general? Is health just energy? When the snail is out of energy, it dies? But that seems too simplistic.”

At this point I should have realized that ‘simplistic’ is a good thing. Instead I decided to try to mimic a scenario that is a little closer to real life. Again, I am no snail expert or biologist and mostly I just…guessed. I want to tweak the system when I move more into the research phase of the project vs the implementing random features and fixing bugs phase. I have a feeling this should have been done the other way around.

Anyway - why does any living organism die? It seems that we die either because of some trauma or injury to our internal organs or…old age. But what is old age, really? How is it different from trauma or injury to our internal organs?

From the very brief amount of reading I’d done it’s partly about telomeres and how efficiently our cells can keep dividing as we get older. Telomeres protect our chromosomes. Each time a cell divides, our telomeres shorten until eventually our cells can’t divide anymore. And then what?

I think that’s when we become more prone to age-related diseases. The immune system is apparently highly related to the length of the telomeres. And when your immune system gets worse our bodies can no longer handle various illnesses as well as they used to, which eventually results in that first thing - trauma or injury to our internal organs that we can no longer recover from.

My cat Rigel has a damaged bladder. A vet “broke” him and he has been handicapped ever since. The bad news is that he may now need to be on medication for the rest of his life. The good news is that there is a chance, especially since he is so young, that his bladder will regenerate over time. The cells and nerves of his bladder may still kick themselves into shape over months or years and he may be able to take a little less medicine or maybe, if a miracle happens, eventually none at all!

This is how I want the snails to work. Organ damage can be sustained, but with a high enough immune system the snail may be able to recover and at least partially heal/regenerate itself. As the immune system weakens organ damage becomes permanent and the snail is not as able to recover. Eventually the snail is just too weak, its organs start failing, and it dies.

The details

I’ve kind of done it in a really hacky way…like all the experimental features so far…which is pretty much all the features.


So a snail has a base organ efficiency score and an organ efficiency percentage. Eg:

  • baseHeartEffic: 60
  • heartEfficPerc: 100%
  • baseLungEffic: 45
  • lungEfficPerc: 90%

The organs so far are:

Yes, I know a snail has more organs than this. But I have sort of stayed away from organs that already are represented by sensors in the brain. These include eyes (vision is accounted for), mouth (taste is accounted for), tentacles (touch is accounted for). They will be added eventually, but I wanted to focus on the others for now.

All snails start with 100% efficiency for each organ. At first I was thinking of not having baesXEffic at all and just have a 0-100 percentage for each snail, but I realized this would be boring. All snails are not created equal. Just as Secretariat had a very large heart, a snail can have a much stronger or weaker organ than average. A simple percentage standard across all snails would not allow for the amazing outliers of nature that we see in real life.


Snails already have a maturity rate (the rate at which they grow after birth). I decided to reuse this for ageing. Snails age every hour. Until a snail is mature it grows each hour based on its maturity rate. Once a snail is mature it begins to age and deteriorate every hour. The amounts may be small - something like 0.05% decrease in immunity per hour. You will be able to boost immunity with supplements, medicines, etc, but for now we are just focusing on the snail’s natural rate of ageing here.

Each minute we check for idle snail actions. Each minute we will also check for any organ damage as a result of those actions. For example, if a snail is operating at 95-100% physical effort it may have a higher chance of heart, lung, or foot damage.


I have not built recovery in yet. I want to see how long a snail might live without any recovery of the organs. Recovery is to follow!

Wild Snails Around the World

Did you know that there is an entirely separate formula to calculate the distance between two points on the surface of a sphere? I mean…it kind of makes sense when you think about it. The shortest distance between two points without accounting for the curvature of the sphere would go right through the sphere itself, making it pretty useless when calculating physical distance on, for example, the surface of the Earth.

I’ve been working on creating some variation in the attributes of wild snails you might catch in different parts of the world. It’s not perfect, but the snails you find in Mobile, Alabama now look generally different from the snails you might find in Stockholm, Sweden.

So far the general testing rules are thus:

  • The snail shells get less red and more blue in them as you travel away from the equator
  • Snail shells get more green in them as you travel East
  • Snail pattern colors are the opposite of the above
  • Snail eye colors are always randomized
  • Snail pattern shapes and sizes also remin random for now, but will definitely change with the region at some later stage

I have added an idealTemp column to the snail table. The ideal temperature of snails you find in the wild in various regions tends to change (warmer toward equator and colder toward the poles). This means you will need to be quite careful when trading with others or buying other people’s snails (or even sending your snail overseas for a race on a foreign track). You’d need to closely control temperature and evaluate how your snail might perform on a track where it is currently 40C when it is used to a temperature of 20C. Temperature conditioning will need to be a thing.

Admittedly with these rules the snails you tend to find end up being a little more boring. Instead of a totally random mishmash of colors you end up with something more constrained. But I think this is ok. Wild snails are not meant to be beautiful or exciting - users are supposed to breed for those traits. If you regularly find unique, amazing snails in the wild there won’t be as much incentive or excitement in learning about your snail’s genetic traits and breeding for a desired result.

As I mentioned before, it takes a couple of seconds for HTML5 geolocation to get your coordinates (and then a few more seconds to get city/country name via the Geoname API). If you for some reason click to search for a wild snail before your location is loaded the coordinates of the search default to the coordinates of your stable.

In addition users will eventually be able to release their snails into the wild. At first it will just mean that someone else can find them. Down the line maybe the wild snails will be able to breed amongst themselves and change the attributes of wild snails in that region.

I have taken some screenshots of wild snails you may find in different places. Here they are:

Mobile, Alabama, US

Setauket, New York, US

San Francisco, California, US

Perth, Western Australia

Stockholm, Sweden

Kyoto, Japan

The North Pole

More Location and Temperature Stuff

I realized I didn’t actually include any implementation details when writing my sleepy post about stable locations and temperature the other night. I figured I’d elaborate on that now.

Having never used HTML5 geolocation features before, I kind of winged it and hacked together something that works for now. Currently I get the user’s location in two cases - on registration, and when searching for wild snails.

Here is how it happens on the registration page:

        function getLocation() {
            console.log('getLocation here');
            if (Modernizr.geolocation) {
                console.log('geolocation in');
                navigator.geolocation.getCurrentPosition(createHiddenInput, geolocationError);
            } else {
                console.log('no native support');

        function createHiddenInput(position) {
            var latitude = position.coords.latitude;
            var longitude = position.coords.longitude;
            console.log('latitude: ' + latitude);
            console.log('longitude: ' + longitude);

            jQuery(document).ready(function() {
                $('#registrationForm').append('<input type="hidden" name="stableLatitude" value=' + latitude + '/>');
                $('#registrationForm').append('<input type="hidden" name="stableLongitude" value=' + longitude +'/>');
                $('#registrationForm').append('Stable Location: ' + getCityName(latitude, longitude) + ',' + getCountryName(latitude, longitude));


Problem - retrieving the location takes a few seconds. If the user happens to register too quickly their location will not be retrieved. As a potential solution I am considering disabling the Submit button until the location is ready…however, what if they don’t want to allow me to retrieve their location at all?

If the user does not let me retrieve their location, it will be set by default to some place in Louisiana. Maybe then I can just display a “Don’t want to be in Louisiana? Wait while we get your location!” message…

So the latitude and longitude is stored for the user’s new account. Then to get the country and city name when displaying where the user is we use the Geonames API. Example:

public static function GetCityName($latitude, $longitude) {
    $cityName = null;
    if (Utility::InternetOn()) {
        $url = "" . $latitude . "&lng=" . $longitude . "&username=myusername";
        Log::info ('connection');
        $xmlDoc = new \DOMDocument();
        $cityNameNode = $xmlDoc->getElementsByTagName("name");
        $cityName = null;
        if ($cityNameNode->length > 0) {
            $cityName = $cityNameNode->item(0)->nodeValue;

    return $cityName;

To get temperature I originally tried OpenWeatherMap but that seems very slow and unreliable. So I am trying out The Dark Sky:

public static function GetCurrentTemperature($latitude, $longitude) {
    $url = "" . $latitude . "," . $longitude;

    $JSON = file_get_contents($url);
    $data = json_decode($JSON);

    $f = $data->currently->temperature;
    $c = Utility::FahrenheitToCelsius($f);

    return $c;

The Dark Sky gives me 1000 free API calls per day. I blew through that in under an hour because I was stupid and calling the API each time I needed to get the temperature. Which is a lot…passive events alone blow through about 200 calls in 5 minutes.

So I added a currentTemp field in the User table and a temp_updated_at field. I added a recurring event to update the temperature once per hour.

Now it is time to start varying wild snail traits based on location you are looking in. I might even embed a Google Map on the wild-snail-collection page so that instead of just clicking “Look under a rock” or whatever you can click on a spot in your general vicinity on a map and see what snail pops up there!

Bringing Snail Stables Down to Earth

SnailLife snail stables have always lived in the ether - in some virtual universe with no physical location. Since I’m trying to make SnailLife based in reality, users’ snail stables should also be based in real locations. This is why now, upon registration, the user’s physical location is used as the location of their snail stable.

Right now in my snail stable it is 15.5 degrees Celsius. I don’t think I’m going to simulate building insulation, so without temperature control it would be about the same temperature in each jar (I may take humidity from the jar’s substrate into account, and have other items adding warmth or cold aside from temperature control gadgets). The user won’t see their exact jar temperature until they install a thermometer in the jar, and they won’t be able to regulate the temperature without installing a temperature controller.


Snail jars have had temperature for a long time, but now that temperature is influenced by real life weather at the stable’s location. This will in turn influence the snails within the jar: their health, mood, etc (this last part is not yet implemented…well, it is only implemented very very roughly).

Different snails will adapt to live better in certain climates, and you will find different kinds of snails in different places. This way if you happen to physically be traveling the world you could hunt for wild snails away from your stable and find totally different patterns, colors, and traits.

Of course, this can only happen if you allow SnailLife to get your coordinates by using HTML5 Geolocation feature. Right now there is no fallback…I was thinking of falling back on location of IP, but that might make it easy for people to cheat and place their stables in rare locations. For now I think I might put you in a really boring part of the world by default when geolocation is not permitted…

Aside from affecting snail health and such in the future, temperature in a jar already affects how quickly consumable items rot. Things rot faster at a higher temperature.

Up next I want to think of a good way to vary snail types based on coordinates. There will be some manually set snail types that are available only in certain areas of the world if I want to make some super cool rare location (eg - get a special snail if you’re at the NASA headquarters!), but for the most part I want to create that variation automatically. I just have to think of a good way to approach this.

Snail Stable Breeding Brands

I haven’t made a SnailLife update in a while, but I had a good reason! For about half a month I’ve been working on an entry into the js13kGames challenge. I’ve entered the challenge annually since it started and this year was meant to be no exception. Unfortunately…I wasn’t really into it this year. It felt like work, and with things at actual work being so busy I found myself not having the time or motivation to sit down and work on it after I get home.

When I work on SnailLife it tends to be relaxing, so I figured why mess with a good thing and decided to go back to snails!

The first thing I did to get back into it was implement stable brands. When a snail is born at a particular user’s stable, if that user has a 3 character identifying brand selected that brand is applied to the snail. It is then displayed in front of the snail’s full name along with its titles (have I talked about titles yet? Snails can become Champions and Supreme Champions if they win enough races). So a snail named Crimson Sunchaser born at Lazerbeam Stables who currently holds two Champion titles and 1 Supreme Champion title and has also birthed or sired enough champion foals to earn it the Champion Breeder title would have its full name displayed as follows:

[LZB] SCH CHx2 CHB Crimson Sunchaser

Ie… Lazerbeam Stables Supreme Champion, Champion x2, Champion Breeder Crimson Sunchaser

Of course most people would refer to this snail by its simple barn name, Crimson Sunchaser.

Currently held champion titles can change (if you get enough CH titles it turns into an SCH for example), but the stable brand can never be removed or modified. If a snail is sold, gifted, transferred in some other way - it will be permanently branded with the stable it was born in.

And that’s it for now! Up next I am implement pre and post-race snail instructions.

I Have Become Crazy Cat Lady, the Buyer of Cat Strollers

I am sorry in advance for what you are about to read. If witnessing the evolution of a mere human into Crazy Cat Lady is something you may find disturbing, turn back now and pretend you never came to this godforsaken place.

I got my cats a cat stroller. Specifically…this cat stroller (in green). This thing had better last us for life.

First, reasoning (aka excuses):

  • Our cats like being outside, both on our cat-enclosed porch and on harnesses in the shared yard. BUT they can’t really walk like a dog does (it’s more like they walk and we follow them around), which makes it difficult to show them new places.
  • Our cats are heavy. Rigel has pretty much outgrown his original plastic carrier (which wasn’t that great quality to begin with). A cat stroller would provide a more comfortable method of transportation (such as to the vet) for both me and him - I don’t have to lug a heavy cat around in a carrier and he gets a much more smooth and comfy ride.
  • Here in Stockholm it is perfectly acceptable to take your pets on public transport. Having had to take Rigel on public transport before, I know how stressful it can be. All the new sounds and smells and people. One thing that doesn’t help is him being low down on the floor in his plastic carrier. Cats like to be up high. Aside from being more comfortable and roomy, the stroller gives the cats a higher position to sit in, hopefully helping them feel a little less stressed and intimidated.

So anyway, it came a few days ago. Here it is:

Pet Gear NV Pet stroller

Kaytu took to it straight away. She jumped in and I rolled her around the house. Rigel took a little longer, but eventually did the same thing.

Cat in Pet Gear stroller

A little later it was time for our first walk! We had a very quick walk around the small shared yard area out front. I didn’t want to go too far too soon and overwhelm them.

Pushing cat in cat stroller

Even David decided to partake in the Walk of Shame:

Cat stroller walk of shame

This morning we took our first longer trip. We didn’t go too far this time, just to a large playground with a small wooded area about a 5-10 minute walk away (in non-cat-stroller-time!)

Two Cats One Stroller

Kaytu seems to have taken a liking to the stroller as soon as it came, even faster than Rigel. But Rigel was more comfortable being outside at a new place. Maybe it’s because he’s been out of the house so much in taxis and on trains out of necessity. I parked the stroller near a bench (the foot brake has already come in handy) and opened the secure top cover. Both cats already had harnesses and their retractable leads on. Rigel stepped out onto the bench and went to explore the nearby bushy area straight away.

Rigel goes to explore

Kaytu, though, was uncomfortable. I don’t think she’s ever been this far from home. I put the cover down a little more to shade her from the outside world and we followed Rigel around in the stroller.

Nervous cat stroller cat

After some exploration we slowly made our way back in the direction of the house.

Cat exploring a bush

Cat next to cat stroller

We rode with the hood up, my holding the leads. Kaytu was a lot more comfortable by this time and sat up front sniffing around. Then she actually decided to jump down and do some exploring of her own.

Cat explores the world

At one point Rigel jumped back in the stroller, rode there for a few minutes, and then hopped back out to do more roaming.

Rigel cat jumps into cat stroller

Rigel the cat walks next to pet stroller

The cool thing is he actually WALKED most of the way home! Kaytu was content to stay in the stroller and be pushed around, but Rigel walked behind me. It was slow going - he’d walk a few seconds, then stop to look around. I would call him and he’d walk again, then stop again. I think he’s starting to learn what “Come” means!

Rigel learns to come!

At one point we were passed by a huge retriever looking dog. Rigel didn’t seem worried at all - he just sat there and looked at it. The owner made the dog sit a few meters away until the dog calmed down (it was very excited), muttering “Friend! Friend!” while pointing at Rigel. Finally Rigel got bored and headed back in the direction of home.

By the time we got back to the yard Rigel was sitting in the stroller and Kaytu was sitting on top of it - it was quite a sight.

Arriving home in cat stroller

Kaytu trying to figure ot what just happened

Cat on top of stroller

Pee-training Rigel

Note: This is part of a series of posts about Rigel the Maine Coon kitten who was given a urinary infection by a veterinarian in Stockholm during a routine surgery and has been struggling with peeing since. You can read more in the Rigel section.

Rigel turned 1 year old on July 22. I was almost afraid to celebrate. We didn’t think he was going to make it to 8 months, having been scheduled to be put to sleep way back in…was it March…and then miraculously peeing at the last minute, on the day we thought we were going to lose him. Here’s a photo of him on July 22:

1 year old Maine Coon

For his Birthday we finished cat-proofing our porch to let Rigel and Kaytu sit there under supervision without a harness. They love it - Rigel now bolts downstairs whenever he hears me going to the door and demands to be let out every morning.

1 year old Maine Coon on porch

The peeing has been…interesting. He has taken to peeing twice a day, but only one of these times seems to be of his own free will. Basically - he has been peeing on his own at 7-8:30am. Then, at 10pm, we bring the other litter box, water, and toys into the bedroom, open a window crack to get some air, and shut all of us in there. David and I watch a show and try to leave Rigel alone (that is, we’re in the same room but not bothering him). We don’t open the door to let the cats out until Rigel pees. Originally this started as a way for me to keep a closer eye on him, to avoid waking up in the morning to find pee in one of the boxes and not be sure which cat it was. This way I can hear when one of them goes in the same room and wake up to see if it’s Rigel or Kaytu. If Rigel goes to pee we let them out because we know he’s peed enough and any pees we find the next morning will probably be Kaytu’s.

But Rigel seems to have seen the connection between him urinating and being let out of the room. Gradually the time between him being locked in and peeing has decreased, though it varies still. A few times he’s entered the box right after shut-in. I guess it’s his way of saying “Screw you guys I don’t want to be in the same room as you and I’ll pee to prove it.”

Sometimes it seems he really doesn’t want to pee when we do this. Last night, for example, he sat on the windowsill as usual for 20-30 minutes. Then we hopped off and went to consider one litter box…no go…then the other…still no go. Then he walked to the door and made a frustrated Maine Coon chattering sound, pawing at the handle. Seeing that it was no use he begrudgingly stomped into one of the boxes, did a nice pee, and went back to the door - at this point we of course opened it.

I guess he’s been accidentally “pee-trained”. On the one hand this seems good - he can make himself pee “on command” when there is something he wants (though the conditions are pretty strict - 10pm on the dot, both boxes in room, window cracked open…it’s like a ritual). On the other hand why doesn’t he feel like peeing by this point himself? If he pees at ~8am that’s 14 hours from morning pee to lock-in. We know he has plenty of urine in him by then. Why does he wait for us to lock him in to actually go?!

Anyway, as long as he’s getting pee out I’m happy. He’s still on medication and we don’t know what the future holds. Every day we’re grateful for a good Rigel pee.

Laravel Log File Backups to S3

SnailLife does a lot of logging for debugging purposes. Aside from the general laravel.log I have separate loggers for each snail and also write logs for stuff like deleted items etc in separate files.

The problem is all the space this takes up on my Digital Ocean droplet in Laravel’s storage folder. If I leave it for a week or two it fills up and I’ll suddenly find my droplet inaccessible or some recurring commands not being able to finish properly due to insufficient space.

Instead of culling the logs more aggressively I decided to set up a backup to Amazon S3. With Laravel 5’s filesystems this ended up being a pretty simple process.

First I set up an S3 bucket called snaillife-storage with a user that has getObject, createObject, and deleteObject permissions.

I set the S3 credentials in the .env configuration file:


Note that I set the region here just in case but in reality I don’t use it. In config/filesystems.php I set up the S3 disk using these credentials (the region setting is removed. I also changed the local disk root to storage_path()):

'local' => [
  'driver' => 'local',
  'root'   => storage_path(),

's3' => [
  'driver' => 's3',
  'key'    => env('S3_KEY'),
  'secret' => env('S3_SECRET'),
  'bucket' => env('S3_BUCKET'),

Then I made a new artisan command called BackUpLogs:

<?php namespace App\Console\Commands;

use Illuminate\Console\Command;
use Storage;
use Log;
use Carbon\Carbon;
use App;

class BackUpLogs extends Command {

     * The console command name.
     * @var string
    protected $name = 'BackUpLogs';

     * The console command description.
     * @var string
    protected $description = 'Back up logs to Amazon S3';

     * Execute the console command.
     * @return mixed
    public function handle()
        if (!App::isLocal()) {
            $localDisk = Storage::disk('local');
            $localFiles = $localDisk->allFiles('logs');
            $cloudDisk = Storage::disk('s3');
            $pathPrefix = 'snailLogs' . DIRECTORY_SEPARATOR . Carbon::now() . DIRECTORY_SEPARATOR;
            foreach ($localFiles as $file) {
                $contents = $localDisk->get($file);
                $cloudLocation = $pathPrefix . $file;
                $cloudDisk->put($cloudLocation, $contents);
        else {
            Log::info('BackUpLogs not backing up in local env');

Note that the directory you specify in $localDisk->allFiles($dir) should be relative to the root path of the local disk - an absolute path does not work.

In Kernel.php I set this to run every hour:

$schedule->command('BackUpLogs')->cron('5 * * * *');

So now every hour all the files in my storage/logs directory are backed up to my S3 bucket and deleted from the local disk.

SnailLife Messaging System

“What’s SnailLife”, you say? Well I’m glad you asked! My snail simulation has gone through a couple of names…and even though I was never 100% happy with Gastropoda it was the best I could come up with - a name that was unique and didn’t allow the project to sound too “gamey” (because it’s not a game). All of the cooler names I could come up with weren’t suitable for various reasons (like domain name availability and such).

But recently I found out about the .life TLD! And I decided that nowadays we have such a varied domain name landscape that .com isn’t as important as it used to be, and definitely not for an obscure hobby project. So Gastropoda is now SnailLife! On to the messaging:


I noticed when working on the simulation that it was tough to figure out who died and why when snails disappeared from a jar.

(Sidenote…I just realized…in real life a snail wouldn’t just disappear from a jar if it died. It would sit there and start decomposing until someone put it away. Maybe this should be the case with SnailLife, too).

Anyway, I wanted something to notify me immediately when something important happens, like a snail is born or dies. So I made a rudimentary messaging system to receive notifications from the simulation, which should be able to be pretty easily expanded into a user-to-user messaging system.

First I made a user_messages table with the following columns:

  • messageID
  • recipientID
  • senderID
  • subject
  • content
  • isRead
  • created_at
  • updated_at

Then I made a UserMessage model that looks like this for now:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class UserMessage extends Model {

    public static $rules = array(
        'recipientID'     => 'integer',
        'senderID'   => 'integer',
        'subject'    => 'alpha_num_spaces',
        'content'    => 'alpha_num_spaces',
        'isRead'     => 'boolean'

    protected $primaryKey = 'messageID';

    protected $fillable = ['recipientID', 'senderID', 'subject', 'content', 'isRead', 'created_at', 'updated_at'];

    public function recipient() {
        $this->hasOne('App\User', 'userID', 'recipientID');

    public function sender() {
        $this->hasOne('App\User', 'userID', 'senderID');

    public function getSenderUserNameAttribute() {
        $username = 'SnailLife';
        if (isset($this->sender)) {
            $username = $this->sender->username;
        return $username;

    public function updateMessage($propertiesToUpdate) {
        return true;

When a snail is killed or born we create a new message for the user. For example:

if ($this->isEgg) {
    $notification = [
        'recipientID' => $this->ownerID,
        'subject'     => 'An egg has died!',
        'content'     => 'Egg ID ' . $this->snailID . ' has died. Cause of death: ' . $cod
else {
    $notification = [
        'recipientID' => $this->ownerID,
        'subject'     => 'A snail (' . $this->snailID . ') has died!',
        'content'     => 'SnailID ID ' . $this->snailID . ' has died. Cause of death: ' . $cod
$notification = new UserMessage($notification);

(An egg is really just an instance of a snail, just one without a birthDate, so when an egg or snail dies it’s handled in the same model).

Then there’s the view. When logged in the user gets a notification of unread messages in the header:

    @if (count(Auth::user()->unreadMessages) > 0)
        <a href="/account/messages"><img src="{!! URL::asset('assets/img/graphics/icons/envelope.png') !!}" alt="You have unread messages"></a> - You've got mail!

Oh, we get unread messages in the User model using an Eloquent hasMany relationship:

public function unreadMessages() {
    return $this->hasMany('App\UserMessage', 'recipientID', 'userID')->where('isRead', '=', 0);

Once they click through they get taken to their message page (ignore the double-death messages. That’s being fixed right now…):

User messages

There they can click to view the individual message, delete messages, mark them as read, etc.

Pretty simple and gets the job done for now.

Update on Rigel and Response From DjurAkuten

Context: The Month from Hell.


After numerous attempts David finally got through to DjurAkuten, the clinic that did Rigel’s neutering surgery and decided to put a catheter in him because they thought his bladder looked big - the one he left with a urinary infection and an inability to pee.

He spoke to them about what had happened. They requested that we email them all of Rigel’s journals, which we did the same day. A week or two later a letter came in the mail (in Swedish) where they claimed that they had zero responsibility for what happened to Rigel because his bladder was already flaccid when he got there. I’m not sure if they even read their own journals on him. DjurAkuten themselves wrote in their records that they found no blockage and no infection in Rigel’s urine and that his bladder contracted normally while being drained during castration - it was certainly not flaccid. They simply thought his bladder was large and decided to poke around with a catheter during what was meant to be a routine surgery.

It’s disappointing because either they are contradicting their own paperwork without even reading it or they are being intentionally misleading. I might upload all of his journals here later for anyone who’s curious and is willing to either translate or reads Swedish.

Here was my email to them in response, sent a few weeks ago, to which we have had no reply even after calling (I have censored the names of the other clinics involved here):

Attn: Ms Susanne Åhman regarding Rigel‏

Dear Ms Åhman,

I am contacting you through email because it is faster than sending physical mails back and forth.

Please let me know if I misunderstood your mail to us about Rigel, but it seems you are saying DjurAkuten takes zero responsibility for anything that’s happened because our kitten came in with a large bladder? The part in your mail about him having a flaccid bladder is not correct. Your own journals have said that his bladder contracted normally after you decided to stick a catheter in him: “efter tömning drar ub ihop sig vad som ser ut som normalt.” It was certainly not flaccid as your own records show.

In fact, the first time your own journals mention a flaccid bladder was when we brought him back to you the 2nd time when he was unable to pee after your treatment.

We are certainly not saying that the problems were as a result of his castration as your mail seems to imply - we are saying his problems are as a result of your introducing a urinary infection while sticking a catheter in him during what was supposed to be simply a castration surgery. There was no good reason to do this.

An Internal Medicine specialist has examined him and communicated that cat organs, just like human organs, can vary in size and shape. We have been told that just because a bladder is large does not mean it has a problem. The fact that he developed an infection after you decided to put a catheter in him is also indicative of an issue being introduced at your clinic. Our kitten was perfectly happy and healthy before his procedure at your clinic resulted in a urinary infection. I can assure you he did not come in sick with an infected, distended bladder. I know this not just by our own observation of him and his very normal urination frequency before your treatment, but by looking at your own journal notes - you decided to put a catheter in him when you noticed his bladder was large and tested for infection. You found no infection. You have also said that his bladder contracted normally after being drained at that time. Your own vet spoke to me in person after the neutering surgery and said that his large bladder can be totally normal for him and not cause any further problems, especially since he’s been peeing normally all along. We came back to you when our kitten could not pee despite straining to after your surgery and catheterization. You stuck ANOTHER catheter in him to drain him AGAIN and said that he now suddenly has an infection. This is what started this entire chain of events - us bringing a healthy, happy kitten to DjurAkuten for a routine surgery and leaving with a kitten who was unable to pee and had to go through a subsequent bladder biopsy surgery, perineal urethrostomy, and countless catheters, blood tests, and needles being stuck into his bladder. He was sent home to die and we still have no idea how he managed to survive after all this. He is still on heavy medication, special food, and constant watch (we still monitor his urine clumps in a box daily to make sure he is urinating enough after this entire ordeal). We have just begun to get over everything he’s been through and everything we’ve gone through to keep him alive, but now seeing you claim that he came to you already sick despite all evidence to the contrary is even more upsetting.

So - am I understanding correctly in that you claim DjurAkuten did not have anything to do with the initial problem - him being unable to pee after being catheterized at your clinic - even though you tested (and cleared) him for infection, despite the fact that other veterinarians have indicated that he was fine before he saw you and got sick after you decided to stick a catheter in him, and that the treatment he received at your clinic and subsequent infection are more than likely related? You will note that in the journals [other clinic] concludes that his original infection was iatrogenic in nature, ie, introduced in the catheterization process. Please confirm if this is the case, as I want to make sure I have correct information about your standpoint on this before we decide whether to pursue a formal complaint and proceeding to warn our friends, breeders, and the public about your clinic.

Kind regards,

Liza Shulyayeva

We are still hoping that they will reply and clarify what they meant by their mail. It’s possible that it was some sort of misunderstanding, and that DjurAkuten didn’t mean to suggest that Rigel was sick all along despite all evidence indicating otherwise. And if they were really trying to convince us that we brought them a sick kitten despite their own records indicating otherwise I will be extremely disappointed as this would indicate their miscomprehension of their own and other hospitals’ records at best and a blatant lie at worst.


Rigel has been suffering from yet another urinary infection after this whole debacle. Perineal Urethrostomy increases the likelihood of infection, and I guess he got unlucky. He is on antibiotics and painkillers/anti-inflammatories. He seems to have gotten worse over the last day (peeing blood again and straining, and starting to pee outside the box) so I rushed another urine sample to the hospital at 4-5am this morning and managed to get an appointment with a vet this afternoon. By the time we had our appointment they had already gotten the results of the sample and said that there was no more bacteria! What was an infection is now a case of cystitis, so our next steps are to:

  • Finish course of antibiotics
  • Appetite booster every other day and special appetite-boosting food
  • Continue with Cystease supplement for bladder lining
  • Start giving Zylkene supplement for stress
  • Continue giving Metacam for 5 days for pain relief and as an anti-inflammatory.
  • Minimize noise and stress as much as possible (coincidentally this seems to have started when David’s kids came over to stay for two weeks a couple of days ago, so noise and excitement maybe triggered something, even though he really likes them).

They also took a blood test and checked his kidney, liver, and other values. Everything seems to be normal, which is a load off my chest.

It’s crazy that one bad incident at a bad vet has spun us into what seems to be an ongoing cycle of vet visits, tests, surgeries, hospital stays, two closets of cat medicine, and endless vet/medicine bills. It’s still amazing to me that he has survived all of these hospital stays and other procedures with his affectionate personality and happiness intact. The difference in his and Kaytu’s approach to life is obvious, though. Even though they’re best friends it’s obvious that Kaytu, with her seemingly carefree personality, hasn’t been through what Rigel has been through - you can see it in their eyes and in how they approach strangers and the outside world. He’s a very strong kitten and we will keep fighting for him and his quality of life no matter what it takes.