An old list of ideas (mostly bad :P) for software projects I’d like to work on. Also see the projects I’ve actually worked on.
Learn Erlang. Write something distributed in it.
Port Tic Tac Toe to the XBox 360, using XNA Studio Express, and distribute it on XBox Live Community Games.
Build network bridges between the DS and PSP, and to the consoles consoles, ie DS to 360 and PS3 and PSP to 360 and Wii, to allow cross-platform multiplayer games. Proprietary commercial libraries for this exist, but handheld support is limited. GameSpy‘s Game Open looks promising, though.
Write a PAM module that acts as an OpenID consumer and authenticates againsts remote accounts. See Gracie, which is a PAM OpenID provider, the Inline Auth Extension (thread), which provides for OpenID authentication outside of a browser, and Scott’s blog post.
wash, the Web (Again) Shell: a command line for the web. Example use cases include checking your bank account balance, adding a movie to your Netflix queue, and listening to your Vonage voicemail, all from the command line. (From TV Raman.)
Write a Steam IM protocol plugin for Pidgin. I haven’t found much information about the protocol, except that despite a misleading wiki page, it’s not based on MSN. We had a small thread on the Pidgin mailing list, but nothing beyond that.
There’s a Python client for GData, but no server. Write one! Even better, now that the Atom Publishing Protocol‘s IETF draft is solidifying, hopefully implementations will start appearing. GData is just a few extensions beyond that!
Improve tcsh‘s dabbrev-expand and bash/readline‘s menu-complete commands to include the entire contents of the app or shell window’s output in their index, not just the history of typed commands. This would make them similar to dabbrev-expand in Emacs.
Write gateways between identity platforms like OpenID, Google Accounts, Yahoo BBAuth, Microsoft CardSpace (see OSIS), Higgins, and others, so they can interoperate. Simon Willison’s idproxy.net is a first step toward this. Sweet!
Phone transcripts! Record all of your phone conversations, then transcribe them with speech recognition. Bonus points: index the transcripts and allow keyword search over them. Search results would link to both the transcript and the recording. Starting with VoIP would skip the telecom adoption hurdle, and the privacy issues aren’t insurmountable. Unfortunately, speaker-independent speech rec just isn’t good enough yet. Sigh.
SnipSnap requires visitors to register and log in before they can comment. Alas, this discourages commenting. Add support for one-time comments a la WordPress and Blogger. Done! See snipsnap comment without login patch.
Write an overlay network that does multicast cleanly and efficiently. Similar to IP multicast, but above the transport layer. Among other things, this would require…
…a good API for Vivaldi, or another network distance algorithm. Write a portable implementation and package it as an easy-to-use library for app developers. P2P overlay networks might be a good initial target audience.
Add color to tcsh and GNU Readline with ANSI color codes. For example, highlight the current region (when one exists), highlight the search string in incremental search, etc. Done! See tcsh highlighting patch.
Write a pine patch to undo top-posting. It would parse an incoming email based on quoting levels, remove duplicate quotes, and display the unique quotes in the order they were written. Thanks to Matt Ackeret and this pine-info thread for the original idea.
Why do modern web sites devote so much space to big, useless images and so little space to links and fields you actually use? This is awful usability, mostly due to Fitts’ law (more). A Firefox plugin that makes links and input fields “sticky” would go a long way toward fixing this problem.
Tuplespaces have a powerful and elegant API, but they’re centralized, so they’re poor distributed data structures. DHTs are great building blocks for distributed systems, but their APIs are weak. Most only provide the functionality of a hashtable – gets and puts of key/value pairs. Write a tuplespace implementation that uses a DHT as its backing store – the best of both worlds! Done! Amazon SimpleDB beat me to it.
Write pine patches to make saving messages smarter. When saving, pine should remove trailing quotes, remove the HTML parts of MIME multipart messages, render HTML-only messages as text and save the text instead, offer to delete attachments, and save the attachment filename in the deletion note. Details in this email thread. Done! See pine delete attachments on save patch and pine remove trailing quote patch.
Contribute to acoc, which I love. First, add specs for more tools like pgrep, identify, tar, jar, etc. Then, extend acoc to detect columnar text output and color accordingly, especially columns that are enums. Finally, maybe extend it to recognize common data types like dates, and color accordingly. Done! Partially. See acoc.conf for context diffs.
Write GreaseMonkey scripts for GMail to address the reasons I haven’t switched from Pine. Specifically, add more keyboard shortcuts, cursor management, and trailing quotes. (Inspired by Humane Gmail autosave and Mihai Parparita’s skinning, persistent searches, and extra keyboard shortcuts.) Somewhat done…see these GMail GreaseMonkey scripts.
Use the newly GSSAPI-capable imaplib to rewrite folderstat so it can talk to my mail server.
Work on synchronizing mp3 playback. We took a stab at this a while ago, and it was technically sound, but it wasn’t very usable. I’m currently working on simplifying it and making it work with more MP3 players on different platforms. Bonus points: support Bonjour (aka ZeroConf). Done…as much as it can be. See p4sync.
It’s widely acknowledged that bandwidth is increasing faster than latency. David Patterson at Berkeley has a writeup (html) on this – he’s determined that, in general, bandwith increases with the square of latency! The standard techniques for masking latency are prefetching, caching, and prediction. Implement these in common applications. More ambitious: write a general-purpose platform that does caching/prefetching, using plugins that provide app- or protocol-specific heuristics.
Build a “reverse” dashboard. It would take a piece of unstructured information (URL, email address, aim screen name, ICQ UIN, code snippet) and “do the right thing” with it (open a browser, compose an email, send an IM, compile, etc.). Done! The Google Toolbar does this. Most snippets of interest come from email or web pages, and since most people use web-based email, it covers the common case.
Self-healing systems have gotten a lot of buzz recently, but fairly little real progress. Investigate what has been done (e.g. Solaris’s fault manager and IBM’s autonomic computing). Separate the content from the hype, and see if similar improvements could be made to Linux.
Infer historical events based on AIM users’ away messages. Build a server that (anonymously!) records lots of people’s away messages, then process them offline and look for large-scale patterns at certain times – concerts, holidays, elections, TV shows, etc.
Build a Pidgin (formerly Gaim) “secretary.” If you go idle, but you didn’t leave an away message, it guesses an appropriate one based on your previous away messages at that time of day, day of the week, etc.
Do stateful packet inspection, at the host level, to monitor the services that are running. Build in a little domain-specific knowledge, and lots of heuristics, to monitor the health of those services. Also record statistics over time so usage patterns are more visible.
Polish bigbrother, add new features, etc.
Write a socket layer that resumes TCP connections if the network layer disappears temporarily, or if your IP changes. The killer app for this would be, if you hop from one WAP to another, your SSH sessions, IMAP mailboxes, IM conversations, etc. would stay open. I think either IEEE or IETF is already looking into this, but I can’t find the working group.
Build a solid, open SNTP library. Implementations exist, both servers and clients, but they’re either not embeddable (ie Java, C#, VB) or closed source (lots and lots of these). A couple open source command-line utilities could be good starting points: DJB‘s prickly, client-only clockspeed and Cambridge‘s much more hacker-friendly msntp. Done! See libmsntp.
Work on PicoContainer and NanoContainer, tools for loosely coupled software engineering. (Technically, they’re implementations of the “inversion of control” and “dependency injection” patterns.) As a start, add Python support.