Skip to content

A compact, dependency-free JS/Wasm implementation of the beloved 16-bit Screen Mate Poe Windows program released in 1996.

License

Notifications You must be signed in to change notification settings

Blobfolio/js-mate-poe

Repository files navigation

JS Mate Poe

ci deps.rs
license contributions welcome

A compact, dependency-free Javascript wasm recreation of the beloved 16-bit Screen Mate Poe Windows program, distributed as a standalone library and a Firefox browser extension.

Add Poe to every site using the browser extension. Most of the time Poe just walks around the bottom of the screen. Sometimes a friend shows up, doubling the fun!

 

About

There have been several ports of Screen Mate Poe since its original release in 1996, but modern desktop environments simply aren't capable of running anything like a "screen mate" app anymore. (Display servers no longer give applications unfettered, global access to every conceivable windowing property, for reasons obvious in hindsight.)

But hey, the Internet is a thing now!

JS Mate Poe is a lean, web-first iteration designed for playback in modern web browsers. It was originally written in vanilla Javascript, but has since been re-rewritten in Rust, and is now compactly compiled to wasm.

It includes all the original characters and sounds, most of the animation sequences — a few desktop-specific things have been omitted, and I've probably forgotten a few — and some new sequences and visual enhancements.

JS Mate Poe has been heavily optimized for both performance and size — it's smaller than the original! — ensuring a minimal impact on page load, bandwidth, and/or user experience. It is framework-free, isolated (via ShadowDOM), leverages hardware-accelerated rendering, and is all around adorable.

You're welcome!

 

Installation

JS Mate Poe is distributed as both a general purpose Javascript library and a Firefox browser extension.

Library

To add the screen mate to your own web page, all you need to do is grab the js-mate-poe.min.js script from the latest release, upload it to a location of your choosing, and add the following code snippet before the closing </body> tag of your HTML:

<script async src="https://domain.com/path/to/js-mate-poe.min.js"></script>

By default, that's all you need to do! Poe will automatically start running around as soon as the script has loaded.

The following attributes can be added to the script tag for more granular control:

Attribute Description
data-no-start Disable autostart. (You'll need to start Poe manually.)
data-no-audio Disable audio playback.
data-no-focus Disable Poe's draggability.

For example, if you wanted to launch Poe without sound support, you'd write this instead:

<script async data-no-sound src="https://domain.com/path/to/js-mate-poe.min.js"></script>

The next section covers the minimal API, which you'd need to use to enable Poe programmatically.

Firefox Extension

The Firefox browser extension lets you add Poe to any and every web site for constant companionship!

To install it, simply click the js-mate-poe_firefox_#.#.#.xpi package link from the latest release.

Firefox should prompt you to install it then and there, but if you end up downloading the file, you can either double-click it, or go to the "Manage Your Extensions" settings page (about:addons), click the gear/settings icon, and select "Install Add-on From File".

Once installed, look for the little sheep icon in the URL bar — visible on all regular pages (but not local or settings-type stuff) — and click that to turn Poe on or off.

If you want to allow audio — see also the known issues section below — you can enable that from the add-on's preferences tab. (Sound is disabled by default.)

Permissions

Browser extension permissions lack nuance, and as such, JS Mate Poe technically requires "access [to] your data on all sites" in order to run.

To be clear, it does not give two bleats about your personal data or browsing history, but because DOM access is an all-or-nothing proposition, is has to ask for EVERYTHING to be able to do anything. 😕

In actuality, all JS Mate Poe needs from the DOM is an ability to add and manipulate its own page elements — the sheep — and query relevant environmental details like the current window size.

The alarmist phrasing is unfortunate, but is what it is.

 

Advanced Library Usage

The standalone Javascript library adds a global Poe class to the window object that you can use for basic control (if you want it):

Property Type Description Default
active bool Start or stop the Poe script. true
audio bool Enable or disable audio playback. true
focus bool Enable or disable the ability to click and drag Poe. true

These are standard getter/setter methods, so can either give you the current value or allow you to make changes depending on how you use them. For example:

// Stop Poe (and remove its DOM elements and event bindings).
Poe.active = false;

// The current status should be `false`, i.e. stopped.
console.log(Poe.active);

// Restart Poe (and recreate its DOM elements, etc.)
Poe.active = true;

// The current status should be `true`, i.e. started.
console.log(Poe.active);

Short and sweet!

 

Known Issues

The Internet is a good habitat for Poe, but not a perfect one. There are a few quirks he has to live with, at least for the time being. Before reporting an issue, please double-check it isn't listed below.

Issue Library Extension Fixed
No Audio X X
Frozen/Duplicate Poe X 1.5.0
No Auto-Updates X 1.4.3

No Audio

Browsers automatically block autoplaying audio to protect users from disruptive advertisements and SPAM. This is a sound decision 😜, but unfortunately means that even when Poe's audio option is enabled, it might not actually be allowed to make any noise.

The only workaround for this is to click somewhere — anywhere — on the page. (Browsers aren't smart enough to recognize PLAY buttons, so have to assume that any sort of click might indicate the user's desire to play something.)

Frozen/Duplicate Poe Instance

Firefox kills any active instances of an add-on before applying an update, but does not reload the page(s) it was running on, effectively orphaning any elements — like sheep! — it may have been managing.

A workaround was added to 1.5.0 to detect and clean up any frozen old sheep resulting from such updates, but if for some reason that doesn't work, all you need to do is manually reload the affected page(s) to return to normal.

No Auto-Updates

The Firefox extension has supported automatic updates since version 1.4.3, but if you were a really early adopter — thanks! — you'll need to manually upgrade once to benefit.

Thankfully that's easy to do: just click the #.#.#.xpi link attached to the latest release to update to that version.

 

License

Copyright © 2024 Blobfolio, LLC <[email protected]>

This work is free. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2.

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004

Copyright (C) 2004 Sam Hocevar <[email protected]>

Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. You just DO WHAT THE FUCK YOU WANT TO.

 

Credits

The original Screen Mate Poe (AKA eSheep, Screen Mate Poo, etc.) was based on Tatsutoshi Nomura's animated shorts "Stray Sheep", which aired on the Fuji Television network in Japan. Mr. Nomura has subsequently published a series of cute children's books and games featuring Poe.

If you're looking for an adorable gift for young readers, be sure to check out "Poe At Play"!