This is my blog.

[[agora]]

The Agora is a distributed knowledge graph and experimental social network.

Let's see how long it will take before spam bots start using it...

Less than 1 month for the lastest mailbox.

Time to change also the way the mail is displayed.

Let's see how long it will take before spam bots start using it...

More than 2 years after, I received spam. I created another contact email.

Surprisingly, the spam was from Brazil. I'm wondering why 🤔

Paper Phone

Paper Phone is an experimental app which helps you have a little break away from your digital world, by printing a personal booklet of the information you’ll need that day.

The Last Page of the Web

You have reached the very last page of the Web.

Your clipboard is only as secure as your device

You can’t assume it’s safe, and even highly technical users no longer have any idea what’s going on with their clipboards. It has all just gotten out of hand.

Emojis as Favicons

Now that all modern browsers support SVG favicons, here's how to turn any emoji into a favicon.svg

CSS Keylogger

How it works This attack is really simple. Utilizing CSS attribute selectors, one can request resources from an external server under the premise of loading a background-image.

Solar Protocol

This website is hosted across a network of solar powered servers and is sent to you from wherever there is the most sunshine.

Last weeks, I reinstalled my (14 years old) thinkpad with Archlinux.

But, as I missed the ChromeOS guest mode, I fully automated the installation to create only one guest account running in tmpfs and launching the min webbrowser configured as I like.

The full installation now time take less than 5 minutes, mostly downloading packages.

Upgrade and configuration are managed automatically too with an ansible crontab.

It seems I'm enjoying Linux distribution's installation again.

MONOSPACE

MONOSPACE: Flip dots with feelings, a JavaScript demo in 1021 bytes, winner of the 1024 bytes demo competition at Assembly 2020.

Kinopio

Kinopio is a visual thinking tool for new ideas and hard problems.

No account is needed, as you can use it only with the browser localstorage if you want.

crisp game lib

Develop one game within one hour.

Another excellent game lib by ABA.

I really enjoy that the game are fully playable on mobile.

Try cywall for example. And it take less than 100 lines of code to implement!

SecureScuttlebot Design Challenge: Avoid Centralization and Singletons

Users may be hosted by many pubs at once, and can change pubs without losing the data or identity. A pub server may go down, and others will still provide service.

SecureScuttlebutt also avoids P2P structures that represent singletons - specifically, it avoids using a Distributed Hash Table or a global blockchain.

Really like the design and philosophy of Scuttlebut, the off-grid social network.

Zine Machine!

That magic is what means this web page is also a zine if you print it!

Chrome to remove HTTP/2 Push

[...] you should start looking into alternatives. For now, that means you need to revert back to HTTP/1 best-practices like inlining critical page resources.

In summary, HTTP/2 Push is dead

Etsy’s experiment with immutable documentation

FYI is a system for adding how-docs directly from Slack. ... In other words, FYIs mitigate staleness by trading completeness for freshness.

Interesting way to share and update short how-to between developpers.

Web Wormhole

Send files quickly using WebRTC.

(t,i,x,y) => 'creative code golfing'

A minimalist coding environment. Control 16x16 points with a single JavaScript function.

Really fun

Fraidycat

Fraidycat is a desktop app or browser extension for Firefox or Chrome. I use it to follow people (hundreds) on whatever platform they choose - Twitter, a blog, YouTube, even on a public TiddlyWiki.

The Fraidycat web extension doesn't access websites as you visit them. It asks for permission to access all websites because it is fetching websites in the background (without using your credentials).

Fraidycat doesn't communicate with a central server - unless your browser syncs Fraidycat's settings to a central server.

I highly recommend this RSS (and others) reader, because it is easy to setup, it doesn't recommend any backend account, and it shows a river of news instead of an news inbox.

Akiyoshi's illusion pages

This page contains some works of "anomalous motion illusion", which might make sensitive observers dizzy or sick. Should you feel dizzy, you had better leave this page immediately.

I printed some of those illusions on paper, and the result is even more impressive, as the observer thinks the paper is moving.

Synchronising tabs

Service worker seems to be the only way to prevent concurrency issue between browser's tabs.

Opera Unite tried decentralizing the web ten years ago

These webapps were quite good at what they did. They were utilitarian and got the job done. It was just the tiny problem of having to explain to grandma why the link you sent to your Unite photo album didn’t work when she tried opening it. Assuming you could even understand the problem yourself. It always worked when you tested from your laptop, right?

Context Coloring

I no longer need help in separating operators from numbers. But assistance in finding the functions and their contexts and influences is valuable.

The Story of Firefox OS

I was a believer of a possible Firefox OS success.

I can only dream of designer's vision like deck now.

Slingcode is a personal computing platform in a single html file.

Slingcode allows you to develop HTML page directly in the webbrowser (no network required) and to run it in an iframe using a blob url.

It also uses webtorrent to share data between multiple devices (I guess internet access is required in this case).

Google pushes “text fragment links” with new Chrome extension

The new link style will allow you to link not just to a page but to specific text on a page, which will get scrolled to and highlighted automatically once the page loads. It's like an anchor link, but with highlighting and creatable by anyone.

TETRIS themed music and visuals in 252 bytes of HTML+Javascript

I'm sure people will start using it as easter eggs in their webapp ^^

Why is This Website Port Scanning me?

Dreaming of a browser which disables javascript and cookie by default...

98.css

A design system for building faithful recreations of old UIs.

My findings after browsing the web without a User-Agent header for one week

What would happen if I removed the User-Agent header from HTTP requests in my browser completely.

Somehow related: microbrowsers are everywhere and they use fake user-agents.

P2P Peer Discovery

Decentralized applications require some way of discovering peers, or other machines in the network that are distributedly hosting some content. P2P discovery requires each node in a network to be able to find other nodes that are storing some data.

This Page is Designed to Last

A Manifesto for Preserving Content on the Web

Local DNS adblocker (and more)

Like some people, I'm working from home nowadays.

Being unable to install an adblocker without a Google account on a Chromebook, I decided to install a DNS server on my local network to block many undesired domain access from any device (mobile, laptop, tv, ...).

I installed raspbian on an 2014 Raspberry Pi 1 B+.

Then, installed unbound: apt install unbound

Finally, I fetched some lists of domains to block:

cd /etc/unbound/unbound.conf.d/ wget -O- https://sebsauvage.net/hosts/hosts | grep '^0.0.0.0' | awk '{print "local-zone: \""$2"\" always_nxdomain"}' > adblock.conf.orig wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling-porn-social/hosts | grep '^0.0.0.0' | awk '{print "local-zone: \""$2"\" always_nxdomain"}' >> adblock.conf.orig sort adblock.conf.orig | uniq > adblock.conf

After activating the DNS as defaut on my router DHCP server, most web pages load really fast.

And computers can be used by children to do home school.

Web Security

The goal of this document is to help operational teams with creating secure web applications. All Mozilla sites and deployments are expected to follow the recommendations below. Use of these recommendations by the public is strongly encouraged. The Enterprise Information Security (Infosec) team maintains this document as a reference guide.

Webpage tracking only using CSS (and no JS)

Be careful when injecting external/inline CSS on your site and use CSP.

MagicEye.js

MagicEye.js is a JavaScript library for generating "Magic Eye" images in the browser.

Did you know that animated autostereograms exist? See this shark.

And ASCII stereograms?

Emulators as embedded file viewers

35 years after its release, Boulder Dash is as enjoyable as I remember.

The Hallway

The Hallway is a decentralized forum using twtxt feeds.

That's nearly like my RSS reader, except all members of the Hallway activated CORS so that the client is javascript only.

After seeing this nice chat, I took the opportunity to add twtxt support to my RSS reader.

A random emoji in your terminal prompt. How and Why!

Nice way to easily see the return status in my shell

Chicken invader

Press ➡️ to shoot lasers at 🐓🥚 but spare the 🛸 Inspired by this cool blog post by Matthew Rayfield.

Pageview Time Experiment

As explained on the sendBeacon documentation page:

it addresses the needs of analytics and diagnostics code that typically attempts to send data to a web server prior to the unloading of the document.

Public IP Address API with two lines of Nginx config

Here is how I set up a "show my public IP address" with Nginx without any backend (no PHP, no Nginx-Lua, ...).

location /ip { default_type text/plain; return 200 $remote_addr; }

Online Text Tools

Online text tools is a collection of useful text processing utilities. [...] All conversions and calculations are done in your browser using JavaScript.

For all Chromebook's users, here are a lot of easy to use tools to manipulate text documents.

They also provide many tools for other formats, like image, json, xml, csv, ...

A web site about Alan Trotter

More informations than what it looks like at first sight.

Slaptrash

It’s a simple way of creating video + audio + text mashups that you can embed in a webpage.

😂

Building a hackable editor - in your browser

Add support to save in localstorage, and you get a nice (but unsecure) Javascript playground.

Building the most inaccessible site possible with a perfect Lighthouse score

Many good advices to make a web site perfectly inaccessible. Definitely worth reading.

Super pixel quest

Digital comic written by Emmanuel Espinasse

XSS on Google Search - Sanitizing HTML in The Client?

An actual XSS on google.com by Masato Kinugawa. It abuses a parsing differential between a JavaScript enabled and disabled context.

It seems the template tag is the usual way to try sanitizing an HTML string on client side.

Web encryption and hashing in javascript with the crypto api

I'm curious to know if browser's crypto API is sensible to the same kind issues reported for the password managers.

Ignore ajax requests in service worker

as long as you can determine synchronously that you don't want to handle the request you can just return from the handler and let the default request processing to take over.

Thanks to this behaviour, it is not mandatory to use the fetch method.

I was able to drop the deprecated CacheManifest of my app. But I'm still not sure my service worker code is correct...

Let's see how long it will take before spam bots start using it...

It took nearly 4 years, as I received my first spam on this mailbox last week. Time to change the contact email.

Blockchain and Trust

Much has been written about blockchains and how they displace, reshape, or eliminate trust. But when you analyze both blockchain and trust, you quickly realize that there is much more hype than value. Blockchain solutions are often much worse than what they replace.

Infinite localhost tunnels

A do it yourself ngrok's alternative with nginx and ssh to publish a local web server.

I recently made my feed reader accessible to anybody.

As all the logic/storage is done in the browser, all your data stay locally and the HTTP queries are all also directly triggered by your machine. However, the downside is that the feed URL must have CORS activated (which is sadly rarely the case).

It supports multiple formats: RSS, Atom, JSONFeed and Indieweb blogs.

To use it, goes to my application, create an OPML file with the outliner, add a feed url and use the subscribe link.

DYI Games Console

A fun and popular coming-of-age project for microcontrollers is to make a game that plays on an oscilloscope. Partly because I couldn't decide which game to make, and partly because I wanted to make something special, I decided to build a games console, with a handful of different games on little cartridges.

Upgrading simple shells to fully interactive TTYs

Using Python for a pseudo terminal

python -c 'import pty; pty.spawn("/bin/bash")'  

Itty bitty

Itty bitty sites are contained entirely within their own link.

Stopping spambots with hashes and honeypots

Rather than stopping bots by having people identify themselves, we can stop the bots by making it difficult for them to make a successful post, or by having them inadvertently identify themselves as bots. This removes the burden from people, and leaves the comment form free of visible anti-spam measures.

Kabas: An Easy Programming Language That Runs in the Browser

It reminds me the GOTO language (and its famous turtle) I discovered at school when I was child.

castling.club

Challenge someone to a game of chess using toots!

No need any account, API token. Simply use your mastodon account and play chess.

I'm wondering what is the complexity to create such activitypub compatible bot.

This idea could also be done with webmention probably.

The Bullshit Web

The vast majority of these resources are not directly related to the information on the page, and I’m including advertising. Many of the scripts that were loaded are purely for surveillance purposes: self-hosted analytics, of which there are several examples; various third-party analytics firms like Salesforce, Chartbeat, and Optimizely; and social network sharing widgets. They churn through CPU cycles and cause my six-year-old computer to cry out in pain and fury. I’m not asking much of it; I have opened a text-based document on the web.

Bring the ice cube to the goal without exposing it to heat.

Brilliant puzzle from Stephen Lavelle (creator of Stephen's Sausage Roll)

bitsy is a little editor for little games or worlds

bitsy is a little editor for little games or worlds. the goal is to make it easy to make games where you can walk around and talk to people and be somewhere.

not sure where to start? try this helpful bitsy tutorial!

Never forget type=”button” on generated buttons!

button elements with no type attribute set are submit buttons by default!

Prefer using input with the type="submit" for form.

Introducing Pinafore for Mastodon

Pinafore is an alternative web client for Mastodon.

This javascript application works offline and allow to browse timelines without network.

PuzzleScript

PuzzleScript is a game engine designed to help you make tile-based puzzle games.

You can directly create your own game from the online editor and export it as an HTML page.

For example, both Mirror Isles and Aunt Flora's Mansion have been created with it.

More games can be found on the gallery.

Decyphering the business card raytracer

Raytracer is the first serious code I wrote on my own. By looking at the generated images I kept, it was really slow, but also really fun to play with.

Record stream from a canvas

Browsers have a native video encoder which can be used to record all modifications done on an HTML canvas.

Pure CSS Masonry in 2018?

Despite all the demo you’ve seen out there a Pure CSS Masonry layout that satisfies both your designer and your content manager is not coming anytime soon.

Javascript is required to implement a masonry layout (see this thumblr theme for example).

I changed the design of my site to display only a grid of blog's posts. Let's see how readable it can be.

Center for Advanced Visual Studies (CAVS) Special Collection

You may also browse a randomized 3-dimensional environment of collection materials below

So disturbing that I don't know if it contains bugs or if it is on purpose.

Today, I switched my webapp to a Progressive Web App.

Step1: the service worker correctly caches the HTML, Javascript, CSS files. The app can work offline! +1

Step2: the web app manifest allows to launch the webapp on mobile as if it was a native android app. The URL navigation bar can be hidden by default, and the webapp has more screen space thanks to this. +1

Step3: window.postMessage doesn't seem to work in this case. -1

Step4: fetch method does not support range header in the context of a service worker, which prevent to audio/video tag to stream the media files. -1

Step5: XMLHttpRequest is not allowed in the context of the service worker. So, it's mandatory to use fetch. -1

Step6: no idea how to not use the service worker at all when playing external media files. -1

Today, I finally still continue to use deprecated CacheManifest and XMLHttpRequest. I still don't understand why they are deprecated if nothing is ready to replace them...

The Disconnect

The Disconnect is an offline-only, digital magazine of commentary, fiction, and poetry. Each issue forces you to disconnect from the internet, giving you a break from constant distractions and relentless advertisements.

Of races and mutexes: synchronizing async operations in JavaScript

In order to transfer the concept of mutexes to JavaScript, recall the problem we want to solve: we need to delay the execution of a async task until another async task has finished.

Engine Tech: Easy Collaboration with Object URLs

When I click that link, the DROOL editor is launched, the "bugs.objlib" file is opened, and the editor for the "bug_eyed.mesh" object is opened automatically.

While doing this during web application development seems natural, I didn't imagine to hack the URL handling on windows to do this for game development. Nice trick.

PS: Thumper is a good game!

One way to test the HTML keyboard navigation

Desactivate in CSS the mouse cursor and use your app. You'll quickly see how hard it can be to use it with only the keyboard.

* {
  pointer-event: none !important;
  cursor: none !important;
}

Web Typography: Designing Tables to be Read, Not Looked At Everything you need to correctly display a table.

Will you see structured data and bots in your email?

Google's Gmail already does this. If you have a JSON-LD event in your inbox, it'll attempt to parse it out. If you're a Gmail user, you've likely seen the "One-Click actions" and event details. That's coming from JSON-LD.

It seems that semantic HTML is more used in email than on the web.

The problem with getting data in and out of the web client

There is a non-standard “mime-type” called DownloadURL. This appears not to be supported in Firefox or iOS, it is supported in Chrome. You give the browser the url to fetch and it will initiate a download once it is dragged outside of the browser.

Announcing JSON Feed

Some feed readers already added support for this new format.

After reading the specifications, I also updated my feed reader for it. As expected, the code is simpler than parsing RSS or Atom.

Now, I just hope a more specific mime-type will be used.

Pagination

Where's the problem? Performance. Your web page is doing "SELECT ... OFFSET 49990 LIMIT 10" (or the equivalent "LIMIT 49990,10"). MySQL has to find all 50,000 rows, step over the first 49,990, then deliver the 10 for that distant page.

Since its version 58, Chrome removed support for commonName matching in certificates. It is now required for the certificate to contain a Subject Alternative Name.

When self-signing a certificate, copy the SAN extension values.

A nice side effect for me is that I was able to replace all my certificates by only one.

Target="_blank" - the most underestimated vulnerability ever

The page we're linking to gains partial access to the linking page via the window.opener object.

I updated my post about video convertion to fix some parameters.

Dwitter

Write tiny live HTML5 demos.

See this one or that one.

You can also watch this talk about Demo Reel and Tiny JavaScript to get some inspiration.

What is Hebocon?

Hebocon is a robot sumo-wrestling competition for those who are not technically gifted. It is a competition where crappy robots that can just barely move gather and somehow manage to engage in odd, awkward battles.

Watch the video presentation: HEBOCON: The Robot Contest for Dummies to see real robots in actions.

If you want to participate to one of the worldwide tournament, do not forget to read the official rules.

The story of Tilde.Club

While the original tilde.club doesn't seem used anymore those days, there are probably other servers running the same software. See for example tilde.town

Neocities

Neocities is bringing back the fun, creativity and independence that made the web great.

Looking at existing sites, web 1.0 was funnier than today. And that's a good way to allow people learning how to make a website.

Alone in Pico : Postmortem of a 3d demake

Be sure reading this impressive postmortem of the Alone in Pico game

/cc @Tristan

Web Audio, the ugly click and the human ear

How to nicely stop a web audio oscillator.

Break the logjam with a simple API

Look at OfficeJS, which provides applications running only in the browser.

They use the jIO library, which access the online storages with cross-domain ajax queries (ie, with CORS activated).

See for example the bookmark app.

Tiny Heist

Terry Cavanagh just released a new game: Tiny Heist. It is a coffee break roguelike playable in the web browser, thanks to the haxegon game library.

PoisonTap

PoisonTap - siphons cookies, exposes internal router & installs web backdoor on locked computers

How the Web Became Unreadable

Grey text on white background is unreadable.

Use tools like Colorable to check the contrast between some colors.

Reverse engineering the 1989 original: the quest for accuracy

You can read more technical informations about the reverse ingineering of Wonder Boy III on the Tigsource forum.

Wonder Boy III: The Dragon's Trap is the next game of Omar Cornut.

Your Social Media Fingerprint

Disabling third-party cookies should be activated by default on browser.

ERRATA: disabling third-party cookie only prevent external website to set cookie. So, it is still be possible to see the social media fingerprint from any page.

Orion

Close the light, put the game in full screen and travel to Mars.

StrongLink - a searchable, syncable, content-addressable notetaking system

StrongLink is a notetaking/blogging system that supports search and sync. You can use content addresses (hash links) to link between entries, regardless of where they were created or where they're being viewed. Currently, entries can't be edited after they've been written, which you can think of like writing in ink.

It follow the principles of Content Addressing and Raise High the Merkle Tree, Programmers written by the author on his blog and content can be addressed with hash URI.

What Is the Web Audio API?

Everything needed to provide a clear overview of the HTML5 functionnalities related to audio.

In case you want to do write a chiptune tracker, read a Tale of Two Clocks to schedule web audio with precision.

WebGL Anti-Patterns

Good advices, which can also be useful for HTML5 canvas usage.

Creating a Simple Bloom Filter

Bloom filters are super efficient data structures that allow us to tell if an object is most likely in a data set or not by checking a few bits. Bloom filters return some false positives but no false negatives. Luckily we can control the amount of false positives we receive with a trade off of time and memory.

L'HĂŠritage Maudit

A cool adventure game by demonixis, using their atlantis.js game engine.

Convert media files for self-hosted HTML5 site

Here are the configuration I use to quickly share media files over my ADSL connection.

Beware: not compatible with Safari (and probably IE)

Image

I use image magick like:

convert input.png -strip -interlace Plane -auto-orient -thumbnail 600x600 -quality 90 output.jpg

Then, display with: <img src='output.jpg' />

Audio

I use ffmpeg to convert the audio files in Opus format, which support seek support on Chrome:

ffmpeg -nostats -loglevel 0 -i input.mp3 -c:a libopus -b:a 128k output.opus
  • -nostats -loglevel to remove all logs
  • -b:a allow to reduce the bitrate

Then, listen with <audio src='output.opus' />

Video

I again use ffmpeg, to encode in VP9 and Opus.

ffmpeg -nostats -loglevel warning -i input.mp4 -c:a libopus -b:a 64k -ac 1 -c:v libvpx-vp9 -pix_fmt yuv420p -crf 10 -b:v 500k -vf scale=426:-1 -keyint_min 150 -g 150 -tile-columns 4 -frame-parallel 1 -threads 2 -f webm output.webm
  • -nostats -loglevel to remove all logs
  • -b:a to reduce the audio bitrate
  • -ac 1 to remove the stereo
  • -pix_fmt yuv420p to set the default vp9 pixel format
  • -crf to define video quality
  • -b:v to reduce the video bitrate
  • -vf scale=426:-1 to resize the video
  • -keyint_min and -g fixes the keyframe interval
  • -tile-columns -frame-parallel -threads to support multitheading

Then, watch with <video src="output.webm" />

<A>

The thing is, if you’re hoping to get mass adoption, being smart is a bug. Being stupid is a feature.

Old School Color Cycling with HTML5

I'm so amazed by the canvas cycle demo and what can be achieved in such constrained environment.

Mark Ferrari did a presentation during the Game Developers Conference explaining his work: 8 Bit & '8 Bitish' Graphics Outside the Box.

Now, I want to play Thimbleweed Park™!

Pastejacking: a demo of overriding what's in a person's clipboard

This method can be combined with a phishing attack to entice users into running seemingly innocent commands. The malicious code will override the innocent code, and the attacker can gain remote code execution on the user's host if the user pastes the contents into the terminal.

It's not like anybody copy/paste command in terminal.

ETag caching gotcha in Roda + Nginx

TLDR: Response before gzip and response after restore from gzip doesn’t have to be byte-to-byte comparable. And that’s what strong ETag suggests. Weak ETag on other hand suggests that response might not be byte-to-byte comparable but the semantics are same.

If your web application can not use the Last-Modified header for caching (which does not allow more than one modification per second), ETag should be used instead. But be careful to use Weak ETag if you have a web proxy to gzip some data.

Playing with history interface

You should use event delegation for better performance and code maintainance. Be also careful to not prevent using the middle click (to open a new tab).

Your click handler should looks like:

document.addEventListener('click', function(evt) {
  if (evt.target && evt.target.nodeName === 'A' && evt.button === 1) {
    // Event triggered: use History API
    history.pushState(...)
    evt.preventDefault();
  }
});

Sparkline theory and practice

A sparkline is a small intense, simple, word-sized graphic with typographic resolution. Sparklines mean that graphics are no longer cartoonish special occasions with captions and boxes, but rather sparkline graphics can be everywhere a word or number can be: embedded in a sentence, table, headline, map, spreadsheet, graphic. Data graphics should have the resolution of typography.

It is possible to directly use unicode characters ▁▂▃▄▅▆▇█ (values U+2581 through U+2588) in your HTML.

You can also use SVG image. SparkSVG provides static SVG images with embedded Javascript to render it directly in the browser.

Jakecache: declarative manifest-driven app cache top of ServiceWorker

Service Worker is great, but if you ever had a look at it's API(s) you realize that they are complicated imperative JavaScript API's. These API's tend to scare many web developers who prefer a nice forgiving declarative approach.

I still don't understand why AppCache was dropped from the HTML5 specs.

Killing CORS Preflight Requests on a React SPA

Browser doesn't make preflight request if:

  • method is GET, POST or HEAD
  • no header manually set except Accept, Accept-Language, Content-Language, Content-Type
  • Content-Type should be: application/x-www-form-urlencoded, multipart/form-data, text/plain

Progressive web apps: the long game

Chrome proposes to add webapp's shortcut on the android homescreen when matching certains criterias.

NoNonsense Forum

A different kind of web forum, where RSS is used everywhere (to get notifications and also as a database!) and where no authentication is required.

On undoing, fixing, or removing commits in git Easy to use git documentation.

Reimagining Single-Page Applications With Progressive Enhancement

A more detailled article about the URL fragment 'hack' which is used to display this page.

The Website Obesity Crisis

I'm trying to disable javascript by default (in Chrome Content Settings) on my Chromebook. Ads go away, all websites are displayed much faster... except when a website doesn't load without javascript!

Microblogging with RSS

I would imagine the UI/UX more like Tumblr, which allows more easily to define the kind of post.

You can do IRC from your browser with plain Javascript.

Excellent!

With a CORS proxy, it could even become an user friendly POSSE to IRC functionnality.

Any idea of a public IRC server that I could 'spam' without making users unhappy?

why is there a # in that URL?

This blog is hosted with a single static HTML page (+ one CSS and one RSS). No javascript is used while reading it.

All posts have their own style with the 'hack' I described here.

How to ask an IndieWeb question?

The IndieWeb wiki advice people to connect to IRC in order to get help.

I'm not at all an IRC user, so, the easiest way for me to achieve this would be to use the online #indiewebcamp chat! and ask the question from my browser. This requires to keep a browser tab always opened and to check it often to verify if anybody answered my question. Such process doesn't seem convenient, as I believe my question will be forgotten after one day (due to logs's rotation).

I was wondering how I could make this more convenient for me when I discovered that the online chat is published with valid h-entry microformat. This means any indieweb reader should be able to parse the IRC logs and so, I don't have to check the online chat manually.

As the IndieWeb IRC bot Loqi automatically posts discovered links related to the Indieweb, I should be able to ask the question from my site, syndicate it on IndieNews, and it should appear automatically on today IRC logs.

If somebody on IRC, I should see the answer on my reader. More than this, the online chat seems to support webmention: does it mean I could reply to an IRC line directly from my site?

If somebody reply from his site and ping me with webmention, it is possible to be quickly notified and start an indieweb thread.

Anyway, time to confront theory to reality: how should I ask a question about IndieWeb while using IndieWeb tools?

Javascript image dithering

Anyone here remember the Nintendo's game boy camera?

This accessory allowed to take tiny picture using the 4-color palette of the Game boy.

A dithering algorithm is used to simulate more colors for the user.

Multiple algorithms exist, and you can learn multiple techniques here.

The game boy camera used the Bayer ordered dithering.

I implemented a tiny javascript example where palettes can be changed and pictures can be saved as PNG in localstorage.

A CURL Cheat Sheet

A excellent summary of CURL options.

This Is Responsive.

Patterns and resources for creating responsive web experiences.

:target CSS selector

I recently discovered Pure CSS slides by Ondřej Žára. This demo show that it is possible to implement a HTML presentation without any javascript.

It uses the CSS :target pseudo class to hide/display element of the page depending of the URL fragment identifier.

As you may have seen, this blog uses URL fragment identifier to provide links to the different posts. After adding some navigation links to browse from one post to another, I activated a CSS to only show the post matching the fragment.

article[class=h-entry]:target {display: block;}
article[class=h-entry] {display: none;}
article[class=h-entry]:target ~ #_about {display: none;}

While the style may be discussed, it provides an incredible fast navigation to the blog.

WebMention activated

I added a WebMention endpoint for this blog. As I don't expect much traffic on it, I kept it as simple as possible and it only consists on a mention storage. No automatic parsing/validation has been implemented.

Meanwhile, I also reopened the HTTP port of my blog, to allow external indieweb tools to fetch it, without getting a SSL validation error due to my own CA.

Simple & straight-forward WebRTC DataChannel establishment

In case you would like to experiment WebRTC, this guide provides a clear overview of the connection process.

I believe it could be possible to combine this with Webmention to create some kind of decentralized VOIP/Video API:

  • Offerer publishes its WebRTC's description on a temporary URL on his website
  • Offerer send a Webmention from this URL to the Answerer web site public contact page
  • Answerer get a notification of this WebMention message
  • Answerer publish a response description on a temporary URL on his website
  • Answerer send a Webmention to Offerer
  • Offerer get a notification and finalizes WebRTC establishment

In order to parse the Webrtc description, it would be needed to specify a microformat.

How to write on the / partition of a Chromebook

Put the Chromebook in developper mode.

Open a terminal (Ctl+Alt+T).

sudo /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification

Reboot.

InstantClick

This Javascript library uses HTML5 pushState and ajax to preload links that user may click on.

It seems ideal to improve performance of static websites.

Via.

Rockin'1000

Congratulations to all those people for their energy and enthousiasm!

Using mutt in the browser

To sum up, you activate the port forwarding from a terminal in order to get another terminal in the browser.

It doesn't seem it is how Gotty developper expected his application to be used :)

But it seems people would like to also use it as a terminal in the browser, which will be fixed when those issues will be solved.

Offline First!

My javascript side project has been modified to go offline first. The landing page now only access the HTML5 localstorage database. It does not expect any connection to a server by default.

Anybody can try/use it without needing any server/account, as all calculation/storage are done on the browser side: virtually infinite number of users only with a static web site.

Run Bike Hike

For FirefoxOS's users, this application allows to keep track of your running/walking sessions. Install it from the marketplace.

Pico 8

A virtual console where you program tiny games in LUA and share them as a .png image.

Signing in to Medium by email

Medium activated some days ago a passwordless signing method: enter your email, receive a link, click on it and you're logged in.

I think it simplifies the site usage (in order for them to keep users) without changing the security.

My workflow to access any webservice is always the same: go to the login page, select reset password, receive a link by email, click on it, enter new random password (with a pwgen like tool) that I don't store/remember and I'm finally logged in for a single session.

If you compare the 2 methods, it's always a matter of receiving an email to access the site. In both cases, if the email account is compromised, it leads to the same kind of issues.

The Link Post

Some of my readers are wondering why the "link" value in my RSS feed sometimes link to external websites: it is because I wrote a Daring Fireball-style linked post, which is a kind of comment about the original link.

Putting the link directly in the RSS allow readers to directly go to it without interruption (in case the RSS reader does not support embedded HTML for example).

Storing Passwords Securely

My document storage application now uses bcrypt to store the password and provides a rate limiting access to the login page after some failed attempts.

RSS added to the blog.

As allowed by the specification, the RSS's items do not have a title element (as they all have a description element).

If your RSS doesn't display the feed correctly, switch to one which correctly display titleless feed items.

This article explains why bookmarklets are dead.

I believe there are more reasons to confirm their death:

  • can not be used on Firefox with CSP activated pages (like Github)
  • can not be used on a chromebook with guest mode (as there is not bookmark tool bar)
  • extremelly difficult to use on mobile devices and firefoxos

At some point, I plan to drop my bookmarklets and replace them by a personal search engine in the URL bar (like DuckDuckGo !bangs but only for my own webservice).

Using SFTP File System instead Google Drive

Please note that this functionnality doesn't seem available in the chromebook's guest mode. There is an "Add new services" button in the Files application, but it does nothing...

Then, I don't believe this can be used instead of Google drive, as it does not provide a real offline mode with file synchronisation. Maybe if somebody ports the unison file synchronizer (as an extension), this could start to be interesting.

What an impressive HTML Canvas demo by Masayuki Kido!

Dive into the tutorial if you want to do some video games / animations.

Flipboard's people use the canvas to get an 60FPS animated RSS reader. While it is also impressive from a technical point of view, I'm not sure loosing the HTML semantic is a good solution in long term.

The web is not an application but it is good for a lot of other reasons.

How to access a raspberry pi running a fresh raspian image, ... without a TTY.

First of all, search for the pi on the network:

nmap -sn 192.168.0.0/24

Then, access it by desactivating the TTY, the host checking and explicitely pass the password:

sshpass -p DEFAULTRASPIANPASSWORD ssh -o 'StrictHostKeyChecking=no' -T RASPIANUSER@192.168.0.1 "dash -i -v"

Since I switched all my domains to HTTPS, I got a lot of bugs with my ZTE Open C phone, running on the default FirefoxOS 1.3 (HTTP cache and cache manifest were buggy).

Sadly, it is not possible to add a new certificate authority if it is non rooted. But the mozilla community provides recent update tools and Firefox OS images for this phones. Be careful, this only works for the french version of the ZTE Open C. Thanks to them, I easily updated my phone to Firefox OS 2.1.

When done, I checked multiple explanation pages to understand how to add a new certificate authority to Firefox OS.

$ sudo 'adb shell "ls -d /data/b2g/mozilla/*.default"'
/data/b2g/mozilla/tvlkvdcd.default/

$ cd /tmp
$ mkdir -p keys && cd keys/
$ curl -k https://me.gidzit.org/gidzit.org-ca.pem > gidzit.org-ca.pem
$ adb pull /data/b2g/mozilla/tvlkvdcd.default/cert9.db .
$ adb pull /data/b2g/mozilla/tvlkvdcd.default/key4.db .

$ echo "" > pwdfile
$ certutil -d sql:. -W -f pwdfile

$ certutil -A -n "gidzit.org" -t "C,," -u "V" -d sql:. -i gidzit.org-ca.pem

$ certutil -d sql:. -L
$ certutil -V -n "gidzit.org" -u V -d sql:.

$ adb push cert9.db /data/b2g/mozilla/tvlkvdcd.default/
$ adb push key4.db /data/b2g/mozilla/tvlkvdcd.default/

Everything correctly works now. Thanks for mozilla and its community for such great tools.

How to make a video game more appealing: Juice it or lose it - a talk by Martin Jonasson & Petri Purho. You can try the Juicy Breakout demo.

But be aware of the weakness of such approach: Don't Juice It or Lose It - a talk by Folmer Kelly.

Interesting presentation from Heydon Pickering about using only HTML semantic in CSS: effortless style.

In order to improve trust over the data sent by my domains, I completely dropped HTTP port, and only access them with HTTPS. Of course your browser will now complain that my sites are not trusted, but to be consistent, browsers should also complain about insecure HTTP sites.

If you trust me, you can still add my certificate authority file in your list of certificates. Doing this fixes all my HTTP cache/manifest issues over untrusted SSL.

Do not hesitate to read those good explanation links to switch to HTTPS:

When configuring, do not hesitate to use the SSLlabs test.

h-card added on the homepage.

Citizen of the Indieweb: level 1. This page now has a rel="me" link. My email is also human readable (nospam1@gidzit.org) with HTML Escape Characters, as for now, I would like not to have custom JS or class based CSS. Let's see how long it will take before spam bots start using it...

Just in case, here is a JS code example to escape the email:

var email = "john@example.org",
  i,
  result = "";
for (i = 0; i < email.length; i += 1) {
  result += "&#" + email.charCodeAt(i) + ";";
}
document.write(result);

TV5Monde's interruption: a password on a post-it