My curriculum vitae, updated on a regular basis. Let's connect!
My curriculum vitae, in a PDF format for print.
A list of most of the open source projects I've founded -- currently 70+ (February 2017).
Code hosting for most of my open source git repositories. Also using github to contribute to other projects.
Actively use stackoverflow.com when developing software. Have contributed with 90+ answers, reaching 2.3 million users, yielding over 13.000 points (February 2017).
My profile on stackoverflow jobs, which also shows my "world ranking" for certain programming skills.
The developer story version of my profile on stackoverflow jobs. Let me know which version you prefer -- a classic CV or the developer story.
My CV with more of a startup focus.
Sometimes it would be convenient to listen to an article, rather than read it. The Talkie browser extension lets you select text on any web page, and have the computer read it out loud for you by simply clicking the Talkie button. It's also an accessibility tool, with shortcuts for reading the selected text to you.
Select text on any web page, and have the computer read it out loud for you by simply clicking the Talkie button.
Project page for the open source Talkie project.
Reviews and ratings page for the Talkie browser extension.
Support page for the Talkie browser extension.
Project: Conversation Augmentation: Chat Mediator Bot
Reduce anger and improve two-way human-to-human conversations with the help of a mediating/moderating chatbot. This particular bot blocks angry messages which have a bad sentiment score from being delivered to the other chat participant.
Improve conversations between humans by adding chatbots to the mix.
Fully customizable social sharing buttons for the privacy aware, proxied through your own server to prevent social networks' tracking. Completely refactored and made into a full-fledged organization/multi-project by me, based on Taskforce's social-buttons-server.
Install custom social share counters on your website with your own hosted solution, which only makes a single API request and loads minimal or zero assets to display the counters.
All Meddelare projects on Github.
Official Meddelare organization account on Twitter.
All Meddelare node packages on NPM.
Standalone Node.js server for easy Meddelare deployment.
Node.js Express web server middleware for in-app, self-hosted Meddelare within your current server.
Node.js promise-based, asynchronous, parallel, per-URL social network share count fetcher -- the base of Meddelare.
The Automatic Tool for AMendments (AT4AM) is law making software used internally in the European Parliament. Have been working on running and promoting the open source version in collaboration with Föreningen för digitala fri- och rättigheter (DFRI).
Ever wanted to change the EU law? Now you can! 'Write me an amendment!' is the most common way MEPs end their meetings with EU lobbyists in Brussels. Whoever has the resources to write change proposals can get them through to MEPs for voting. Now, what would happen if that invitation was extended to every citizen in Europe? Well, you're hereby invited. AT4AM is for all and everybody who wants to write an amendment and send to MEPs who care to listen.
A collection of open source software related to AT4AM.eu
Official AT4AM.eu account on Twitter
The Föreningen för digitala fri- och rättigheter (DFRI) project page for AT4AM.eu
jq - a lightweight and flexible command-line JSON processor
Used jq in a few projects, such as my master's thesis and for the European Parliament hacks, and felt it was time to contribute to the project by building a complete package management system.
This is a complete package manager for jq. It takes care of downloading and installing packages, as well as making sure they are linked properly when executing jq.
Provide fallbacks for bad values.
Sort objects by keys or values.
Count occurances of values across objects and arrays.
Integers and floats as strings, padded with zeros to your liking.
Manipulate strings without stress.
Don't repeat yourself! Apply a filter `f` to its own output `n` times. Can be used to apply filters 'n' recursive levels, to build deep objects and for arithmetic.
Manipulate arrays while avoiding general disarray.
Count occurrences of values within a range.
Counter buckets for the [0,1] range.
Counter buckets which also collect values outside an integer interval '0..n-1' in the first and last buckets respectively.
A collection of basic mathematical functions.
A big integer library for working with possibly-signed arbitrarily long decimal strings.
An implementation of the BSD libc rand() pseudorandom number generator (PRNG) function. The range is [0,2147483647].
An implementation of the Microsoft C Runtime rand() pseudorandom number generator (PRNG) function. The range is [0,32767].
An implementation of the Van der Corput quasirandom sequence generator function. The range is [0,1).
This repository is now made obsolete by upstream fixes in jq, in commits after jq-1.5rc1-12-gcca3e92
Master's thesis: Swedes Online: You Are More Tracked Than You Think
My master's thesis for a Master of Science in Information Technology and Engineering at Linköping University, Sweden
How many companies are tracking you online, and how much information does the average Swede leak while using popular .se websites? Many, and a lot - more than you think. Large organizations are able to connect the dots you leave behind during everyday usage, and construct a persona that reflects you from their perspective. Have you told your family, friends, or colleagues about your gambling addiction, your sex toy purchases, or your alcoholism? Even if you didn't tell anyone your deepest secrets, these companies might conclude that they can put labels on you by looking at everything you do online. And now they are selling it as hard facts behind the scenes.
The source for my master's thesis report, and other documents.
Research paper by me and my master's thesis examiner, Niklas Carlsson, based on my thesis.
Scriptable batch downloading of webpages to generate HTTP Archive (HAR) files, using PhantomJS.
Extract data from HTTP Archive (HAR) files, quite possibly downloaded by har-heedless, for some aggregate analysis.
Using har-heedless to download and har-dulcify to analyze web pages in aggregate.
Project: DNSSEC name and shame!
Checking DNSSEC support for the world's largests sites. Coded at a hackathon 2014-04-23--24, received a prize and a bunch of attention in the world of DNSSEC.
Created together with Tom Cuddy during The Next Web's Kings of Code Hack Battle in Amsterdam 2014 - it even won PayPal's prize. Attended sponsored by Verisign Labs and NLnet Labs to use getdnsapi - thanks!
The official video from the presentation on stage at The Next Web's Kings of Code Hack Battle.
Video from the presentation on stage at The Next Web's Kings of Code Hack Battle, shot by our getdnsapi's sponsors Verisign Labs and NLnet Labs.
The source code for dnssec-name-and-shame.com
Our entry for the TNW hackathon, which won us PayPal's prize.
A dedicated blog post in Internet Society's Deploy 360 blog, by Dan York.
A blog post by Wouter Wijngaards and Olaf Kolkman from NLnet Labs summarizing the getdnsapi teams efforts during TNW.
The offical dnssec-name-and-shame.com account on Twitter
Tweets mentioning dnssec-name-and-shame.com
Project: Improving user experience in HTML forms
A collection of open source projects coded 2011, 2012, 2013 and a presentation about them, held 2013-12-09.
This is the video recording of the presentation.
Here are the code examples from the presentation.
Held the presentation Improving user experience in HTML forms 2013-12-09. "Some of the user experience/behavior in HTML5 forms isn't standardized across browsers/platforms, but with a bit of scripting it can be. There are also additional ways to improve your forms, especially for repeated use in administrative systems, and Joel will showcase a few open source libraries to help you out."
My own fork of the HTML5 form validation compatibility script, with many useful features and fixes.
A jQuery plugin to exempt selected form fields from the forward tab order.
A jQuery plugin to use the numpad plus key as a tab key equivalent.
A jQuery plugin to emulate tabbing between elements on a page
A jQuery plugin to clean input fields with common functionality, like trim, normalize whitespace, digits only. It is also easily extensible.
Canadian extensions to AutoCleanCallback (required).
Compare two strings to see what has changed, and perform some string manipulation.
A jQuery plugin to show and hide follow up questions in a form.
A jQuery plugin to check if *anything* has changed in *any form* on a page, and warn the user before leaving the page.
Scripts to extract HTML form field information from one or several webpages.
Project: Analyzing erroneous and corrected votes in the European Parliament
Went to the Europarl hackathon in Brussels 2014-01-24--27 and wrote a few tools.
Project page for my European Parliament hacks, mainly from the January 2014 EuroParl.me hackathon
Using data on erroneous/corrected votes in ep-erroneous-votes, based on open data dumps from Parltrack, to visalize erroneous, and subsequently corrected, votes by Members of the European Parliament.
Using open data dumps from Parltrack to analyze erroneous, and subsequently corrected, votes by Members of the European Parliament.
Article in Altinget.dk, a Danish political newspaper, by Rikke Albrechtsen, about the Danish social democrat MEPs and their comparatively high number of corrected votes.
Article in EuroParl.me by Geraldine Nethercott, about the the erroneous/corrected votes project I worked on during the January 2014 hackathon.
Article in The Guardian by Emma Howard, about the January 2014 EuroParl.me hackathon. "United by 'hackers' spirit', participants at a Brussels hackathon bring the actions of MEPs under scrutiny for the first time"
Article in Euronews by Marie Jamet, about the January 2014 EuroParl.me hackathon.
Article in Euronews (in French) by Marie Jamet, about the January 2014 EuroParl.me hackathon.
Blog post in La Vanguardia (in Spanish) by Lina María Aguirre, about the January 2014 EuroParl.me hackathon.
Article in Mondiaal Nieuws (mo.be, in Dutch) by Laurens Cerulus and John Vandaele, about open data and the January 2014 EuroParl.me hackathon.
Project: ClaimID dump
When claimid.com shut down, I wrote a tool to extract the links that they had abruptly dumped into open cyber space in December 2013.
A service to extract and dump links and data from shut down claimid.com user pages.
The source code to for the service to extract and dump links and data from shut down claimid.com user pages.
One of the founders of ClaimID.com mentions my claimid-dump tool as an alternative after their shutdown.
Claimid-dump mentioned in a blog post by Ken Schumacher.
Claimid-dump mentioned in a blog post by Arvid Linde.
Tweets mentioning claimid-dump
Project: bespoke.js presentation plugins
While preparing a public presentation I found bespoke.js, and decided to write a few plugins for it.
Show slide notes in a secondary window/screen with Bespoke.js (presentation/demo)
Keyboard shortcuts to jump straight to a specific slide in Bespoke.js (presentation/demo)
Auto advance slides on a timer in Bespoke.js (presentation/demo)
Convenient extension methods for building Bespoke.js plugins (presentation/demo)
Keep track of the active slide in Bespoke.js (presentation/demo)
Log bespoke.js events and state to the console (presentation/demo)
Visitor analysis per slide in your Bespoke.js presentation (presentation/demo)
Show slide notes in a secondary window/screen with Bespoke.js (source code)
Keyboard shortcuts to jump straight to a specific slide in Bespoke.js (source code)
Auto advance slides on a timer in Bespoke.js (source code)
Convenient extension methods for building Bespoke.js plugins (source code)
Keep track of the active slide in Bespoke.js (source code)
Log bespoke.js events and state to the console (source code)
Visitor analysis per slide in your Bespoke.js presentation (source code)
Project: Thought About You
A small Android project that was the results of some idle talk in a bar.
Android application in the Google Play Store, for this for-fun project. "When did you last call someone out of the blue? Why not do it today! It's as simple as the click of a button. Thought About You helps you by calling the ones you care about and love. Try it out now!"
Project web page for this for-fun project.
If you want to see a new feature, have experienced bugs or want to say hi this is the place.
Code snippets and projects I've founded, co-founded or contributed to
Stricly command line based music queue manager/player for extra nerd credits.
Simulate stroking keyboard keys into another application/window while taking screenshots to create a `.gif` animation.
Easy installation of my open source software using `brew` on Mac OS X.
Played around with the canvas for use in the background of a website, and ended up with this.
The source code to hexagonif.
A jQuery wrapper/plugin for mutation-summary, the DOM mutation-observers wrapper. It adds easy, chainable .mutationSummary() calls to your jQuery objects.
Selective fabric deployment of a compiled project using a git repository betwixt and between your source code and target machine.
A node.js configuration convention with a minimal readonly interface.
Collects functions that should be called in the future.
WellCompareDir is a tool to compare and select images with the same name from two folders, and copy to a third folder. Created for an immediate need while working on Fröer.nu, released as open source.
A presentation on COM2CORBA, without the gory tech details.
An open-source project for generating COM interfaces from CORBA services. Made by a group of students for BAE Systems Hägglunds AB.
A tool to enable or disable active window tracking, raising and also the delay in milliseconds. This is known as x-mouse behavior.
A simple tool to convert WWF documents to normal PDF documents
Play/view multiple video player streams in the same browser window by using iframes.
Documents and other university material
My official transcript of records from Linköping University. It's a full Master of Science in Information Technology and Engineering, except for the thesis which was finalized in 2015.
Creating an application prototype for finding the trendy recipes, with a mobile phone that reads barcodes of ingredients.
A shoot-em up game, an adventure game and one game design for an action/driving game. Try them out!
A two-hour presentation on the techniques used in access networks (fiber/phone/cable/wireless) held together with another master student.
A report and presentation on techniques surveyed and what's in use.
A 100+ page report on a project investigating and partially implementing a robot used to transport patients between different areas of a hospital. Worked with six other master students full time during one semester.
Member of the board of webmasters for computer/information technology engineering students 2003-2006. Helped completely redesign the site in the fall of 2003. Implemented on the Roxen.com platform using revolutio...
Internet, privacy, open data and miscellaneous activism
Actively promoting certain views
Key ID: 8192R/2A977668 2013-12-26. Fingerprint: 4C47 B4FF 173A E6ED 0DB7 3394 6DF6 890D 2A97 7668
Author page at DFRI, where I was an active member in 2013/2014/2015/2016.
A non-Facebook version of their #CelebratePride campaign, which adds the rainbow flag to photos but requires a Facebook account and have restrictions on the images the rainbow flag can be applied to.
The source code for the fly-the-rainbow-flag.com image uploading and image manipulation.
A small utility to extract a list of first name, surname and email to all members of the Swedish Parliament.
Wrote a post about the first #MeraKrypto conference in Stockholm, promoting cryptology for companies, organizations and others who are interested.
Wrote a post about The Day We Fight Back, 2014-02-11, in order to collect signatures against mass surveillance.
Wrote a post about Dagen vi slår tillbaka (in Swedish), 2014-02-11, in order to collect signatures against mass surveillance.
Wrote an email to all members of the Swedish parliament, on behalf of DFRI. "DFRI vill ha transparens i de beslutsprocesser som rör inskränkningar i medborgares digitala fri- och rättigheter. Vi tror att proposition 2013/14:KU6 ökar hemlighetsmakeriet och minskar förtroendet för de demokratiska processerna."
Wrote an email to all members of the Swedish parliament, on behalf of DFRI. This is a partial translation from the Swedish version of this blog post.
Wrote an email to all members of the Swedish parliament, on behalf of DFRI. This is the wiki page regarding the correspondence
Attended and took notes during one of the DFRI board meetings. This one was held at 30c3, Hamburg, Germany.
Helped organize DFRI:s track during the Swedish Internet Days, which included several talks plus a panel discussion with DFRI and Cory Doctorow.
Organized a work meeting for DFRI members - new ones in particular.
Organized a meeting regarding attracting funds to DFRI.
Profiles: work related
Some soft of work related profile on other sites.
My profile on meetup.com, which is my preferred developer/techie meeting organizing website.
Profiles: software related
Some profile pages about me on random sites I may or may not have signed up for.
Code snippets and small plugins that do not have documentation and a test suite yet.
Links to my open source software programs, and their alternatives.
My profile on SourceForge.
My profile on Google Play Store.
My plugins in the Node Package Manager.
My plugins in the Bower Package Manager.
My plugins in the jQuery Plugin Registry.
My GitHub commits to my own and others' repositories analyzed at Open Source Report Card.
My profile on David, a dependency management tool for Node.js projects.
My profile on Packagist, the PHP package archivist.
My GitHub résumé, generated automatically using public information from my GitHub account.
My profile on Gratipay, where you can help support my open source development.
Visitor statistics for my gihub hosted projects.
My personalized MIT license page.
General internets links
Stuff I am, or have been, a part of.
The portal to my professional pages, in English. The current version was developed in 2010.
The portal to my professional pages, in Swedish. The current version was developed in 2010.
The portal to my professional pages, in German. The current version was developed in 2010.
Am an avid traveler with many friends from around the world. While traveling I often stay with locals, at home I host other travelers. Site requires registration to view profile.
Felt Stockholm lacked a boardgame group on Meetup.com, so created one.
My search results in Google.
My search results on Twitter.
My profile on the Chaos Computer Club's 30c3 wiki.
Congratulations! Joel Purra is this month's winner of 1 free month @pluralsight subscription.
Honorable mention as a traveling developer at my first meeting in Rio de Janeiro.
Attendant at conference about software development.
Placed #29 this year, with my two team mates.
Our team's preparations and thoughts on security and performance of our system.
Another article (in Swedish) about the cyber warfare exercise with FOI, FRA, and more.
An article (in Swedish) about the IT defense exercise.
Ended up #30 with my two team members.
My cafepress shop, where I sold a few t-shirts with custom designs from 2004.
Co-designed and co-coded a small site for me and my fellow Swedish Army second lieutenant/company level military officers at S1 Enköping.
Internet tools, services, servers
Tools, services and servers used by/for other projects and sites of mine.
Email lists related to joelpurra.com and other adventures of mine.
Tracking of visitors of projects and sites of mine. Data is kept locally on my piwik server.
Personal instance of Meddelare.
Personal instance of a Stripe payment gateway, used for payments and donations to projects of mine.
Personal file server serving data and other files related to projects of mine.
Public websites I've worked with, most of which have been upgraded, replaced, or terminated
My own creation. Selling flower and vegetable seeds by mail in Sweden. The current version was developed in 2010, evolved from the original code from 2001. Worked there part time/seasonal circa 2001-2013.
My own creation. Was under re-development, now dormant. Selling motocross clothes and accessories by mail in Sweden. Worked there circa 1998-2007.
A planned expansion to our suite of ecommerce sites: selling tea online.
Designed and coded an ecommerce site for a motocross/enduro/speedway product/spare parts manufacturer in Habo, Sweden. We worked on it for months on and off, but it never got released.
Designed and coded a small site for a team of motocross riders in Stockholm.
Designed and coded a small site for a phone and telecom services company in Stockholm.
Designed and coded a small site for a electrical and network hardware installation company in Stockholm.
Designed and coded a small website for a senior consultant in telecommunications. Worked on the site in 2001.
Designed and coded a small website for a senior consultant in telecommunications. Worked on the site in 2001.
Co-designed and co-coded an alternative version of R2M.net as part of our final semester at Forsmark Skola. The site looked great and impressed all web developers with its technical quality, but was never release...
Domains for sale
Over the years I've purchased and used domains for longer and shorter periods of time. Some of these domains are now for sale.
Domain previously used for a family company.
Domain previously used for a family company.
Planned usage was for an open source project.
Everyone wants to see the pearly gates.
This will be something, some day.
My bookmark domain for the original Lifehacker, where I get a lot of useful tips.
Nerd humor? Check the IP - it's your new test address! ;)
My favorite lake, just south of Stockholm.
Graphical demonstration of integration techniques in math
For a while in 1999 I wanted to get into the design template business.
My first personal web page - with super duper cool graphics!