ideas I've worked on a [number of software projects](software), but I have lots more ideas for projects I'd _like_ to work on. I can't pretend that they're particularly good ideas, but it seems like a waste to just forget about them. So, here they are! * Learn [Erlang](http://erlang.org/about.html). Write something distributed in it. * Port [Tic Tac Toe](tictactoe) 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](http://www.unrealtechnology.com/technology.php) [commercial](http://www.poweredbygamespy.com/services/view/category/connect/) [libraries](http://www.quazal.com/modules.php?op=modload&name=Sections&file=index&req=viewarticle&artid=3&page=1) for this exist, but handheld support is limited. [GameSpy](http://www.poweredbygamespy.com/)'s [Game Open](http://open.poweredbygamespy.com/) looks promising, though. * Write a [PAM](http://www.kernel.org/pub/linux/libs/pam/) module that acts as an [OpenID](http://openid.net/) consumer and authenticates againsts remote accounts. See [Gracie](http://trac.whitetree.org/gracie/), which is a PAM OpenID _provider_, the [Inline Auth Extension](http://extremeswank.com/openid_inline_auth.html) ([thread](http://openid.net/pipermail/specs/2007-September/001969.html)), which provides for OpenID authentication outside of a browser, and [Scott's blog post](http://kveton.com/blog/2006/12/10/openid-pam/). * 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](http://netflix.com/) queue, and listening to your [Vonage](http://vonage.com/) voicemail, all from the command line. (From [TV Raman](http://en.wikipedia.org/wiki/T._V._Raman).) * Write a [Steam](http://steampowered.com/) IM protocol plugin for [Pidgin](http://pidgin.im/). I [haven't found](http://www.google.com/search?q=steam+protocol) much information about the protocol, except that despite a [misleading wiki page](http://developer.valvesoftware.com/wiki/Friends/Suggestions), it's not based on MSN. We had a [small thread](http://pidgin.im/pipermail/devel/2007-November/004035.html) on the [Pidgin mailing list](http://pidgin.im/cgi-bin/mailman/listinfo/devel), but nothing beyond that. * There's a [Python client](http://code.google.com/p/gdata-python-client/) for [GData](http://code.google.com/apis/gdata/overview.html), but no server. Write one! Even better, now that the [Atom Publishing Protocol](http://www.atomenabled.org/developers/api/atom-api-spec.php)'s [IETF draft](http://ietfreport.isoc.org/idref/draft-ietf-atompub-protocol/) is solidifying, hopefully implementations will start appearing. GData is just a few extensions beyond that! * Write a [session management plugin](http://sourceforge.net/mailarchive/message.php?msg_id=37745715) for [Pidgin](http://pidgin.im/) (formerly [Gaim](http://gaim.sf.net/)). **\[_Done! See Mattperry's [SessionSave plugin](http://somewhere.fscked.org/sessionsave/)._]** * Improve [tcsh](http://tcsh.org)'s [dabbrev-expand](http://www.tcsh.org/tcsh.html/Editor_commands.html#dabbrev-expand) and [bash](http://www.gnu.org/software/bash/)/[readline](http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html)'s [menu-complete](http://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC19) 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](http://gnu.org/software/emacs/manual/html_node/Dynamic-Abbrevs.html#index-dabbrev_002dexpand-2449). * Write gateways between identity platforms like [OpenID](http://openid.net/), [Google Accounts](http://code.google.com/apis/accounts/Authentication.html), [Yahoo BBAuth](http://developer.yahoo.com/auth/), [Microsoft CardSpace](http://cardspace.netfx3.com/) (see [OSIS](http://osis.netmesh.org/)), [Higgins](http://www.eclipse.org/higgins/), and others, so they can interoperate. **\[_Simon Willison's [idproxy.net](http://idproxy.net/) is a first step toward this. Sweet!_]** * [Mock out](http://en.wikipedia.org/wiki/Mock_Object) the [Google Ajax Search API](http://code.google.com/apis/ajaxsearch/) for offline development and testing. Use failure injection, etc. to determine behavior. * [Pidgin](http://pidgin.im/) (formerly [Gaim](http://gaim.sf.net/))'s [TOC prpl](http://gaim.sf.net/protocol.php#toc) hasn't been updated for [2.0.0](http://sourceforge.net/project/showfiles.php?group_id=235&package_id=253&release_id=456679). It doesn't build in any of the beta releases. It should be either brought up to date or officially deprecated and removed. * Fix a [bug](http://www.mail-archive.com/wget%40sunsite.dk/msg09351.html) in [wget](http://wget.sunsite.dk/) that prevents `--html-extension` and `--convert-links` from playing nicely together. * Write an [OpenID](http://openid.net/) plugin for [PyBlosxom](http://pyblosxom.bluesock.org/). **\[_Done! See [OpenID server plugin for PyBlosxom](pyblosxom_openid_server)._]** * Write a [Google Ajax Search API](http://code.google.com/apis/ajaxsearch/) plugin for [PyBlosxom](http://pyblosxom.bluesock.org/). **\[_Done! See [site search with the Google AJAX Search API](site_search_with_the_Google_AJAX_Search_API)._]** * Add support for [comments](http://pyblosxom.bluesock.org/blog/registry/input/comments) to the [photogallery](photogallery) plugin for [PyBlosxom](http://pyblosxom.bluesock.org/). * **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](http://en.wikipedia.org/wiki/Computer_speech_recognition#Use). Sigh. * Write a single-sign-on server (as [described here](http://manageddreams.com/osmpbb/viewtopic.php?t=179)) for the [Open Source Metaverse Project](http://metaverse.sourceforge.net/). It'd probably be based on [Kerberos](http://web.mit.edu/kerberos/). * [SnipSnap](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](http://wordpress.org/) and [Blogger](http://blogger.com). **\[_Done! See [snipsnap comment without login patch](snipsnap_comment_without_login_patch)._]** * Work on [Beagle](http://beagle-project.org/) (formerly [Dashboard](http://nat.org/dashboard/)), which is wicked cool, or [Tenor](http://dot.kde.org/1113428593/), which may someday be even cooler. * Write an overlay network that does multicast cleanly and efficiently. Similar to [IP multicast](http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/ipmulti.htm), but above the transport layer. Among other things, this would require... * ...a good API for [Vivaldi](http://project-iris.net/bib.html#networking), 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. * Write elisp for [filling code in Emacs](filling_code_in_Emacs). This is my single biggest wished-for Emacs feature. **\[_Done! See [fillcode](fillcode)._]** * Emacs' [refill-mode](http://www.gnu.org/software/emacs/manual/html_node/Refill.html) and [filladapt](http://www.wonderworks.com/#filladapt) don't play well together. Make them! **[_Never mind, refill-mode isn't all that anyway._]** * Add an undo command to [tcsh](http://tcsh.org). [Bash has one](http://www.gnu.org/software/bash/manual/bashref.html#SEC93), courtesy of [Readline](http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html), so I have shell envy. **\[_Done! [Emacs shell-mode](http://gnu.org/software/emacs/manual/html_node/Shell-Mode.html) does this._]** * Add color to [tcsh](http://tcsh.org) and [GNU Readline](http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html) with [ANSI color codes](http://www.termsys.demon.co.uk/vtansi.htm#colors). For example, highlight the current region (when one exists), highlight the search string in incremental search, etc. **\[_Done! See [tcsh highlighting patch](tcsh_highlighting_patch)._]** * Add [delete-selection-mode](http://www.emacswiki.org/cgi-bin/wiki/DeleteSelectionMode) to [tcsh](http://tcsh.org) and [GNU Readline](http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html). **\[_Done! [Emacs shell-mode](http://gnu.org/software/emacs/manual/html_node/Shell-Mode.html) does this._]** * [Referrer spam](Referrer_spam) is evil. Extend [Tony Buser](http://juju.org/)'s [derefspam](http://www.juju.org/archives/2005/01/21/derefspam) script to use DNSBLs and RBLs like [Spamhaus](http://www.spamhaus.org/xbl/index.lasso), [BSB](http://bsb.empty.us/), [Blitzed](http://opm.blitzed.org/info), and [SURBL](http://www.surbl.org/faq.html). * Implement [JWZ](http://www.jwz.org/)'s [Intertwingle](http://www-archive.mozilla.org/blue-sky/misc/199805/intertwingle.html) idea as a [GreaseMonkey](http://greasemonkey.mozdev.org) user script for [Gmail](http://gmail.com/). (I'd love to do it for Pine, but it's way too ambitious.) * Write a [pine patch](software#patches) 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](http://mailman1.u.washington.edu/pipermail/pine-info/2005-June/042260.html) for the original idea. * Add [sieve](http://sieve.info/) support to [Gmail](http://gmail.com/). * Build a simple webapp with [Django](http://www.djangoproject.com/). Is it really as good as [Rails](http://www.rubyonrails.com/), [Struts](http://struts.apache.org/), and [Zope](http://www.zope.org/)? **\[_Done, at [work](http://google.com/). Django templates rock!_]** * Revive [jxtapy](http://jxtapy.jxta.org/), which was founded to provide Python bindings for [JXTA](http://jxta.org/), but never got off the ground. Use [Jython](http://www.jython.org/) to get a running start. * Add support for multiple-month events to [remind](http://roaringpenguin.com/penguin/open_source_remind.php), my calendar of choice. For more info, see this [email thread](remind_multiple_months.txt). * 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](http://en.wikipedia.org/wiki/Fitts'_law) ([more](http://asktog.com/columns/022DesignedToGiveFitts.html)). A Firefox plugin that makes links and input fields "sticky" would go a long way toward fixing this problem. * [Tuplespaces](http://www.almaden.ibm.com/cs/TSpaces/) have a powerful and elegant API, but they're centralized, so they're poor distributed data structures. [DHTs](http://www.nwfusion.com/details/805.html) 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](amazon_simpledb_thoughts) beat me to it._**] * Write [pine patches](software#patches) to make saving messages smarter. When saving, pine should [remove trailing quotes](pine_remove_trailing_quote_patch), 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](http://mailman1.u.washington.edu/pipermail/pine-info/2005-June/042260.html). \[**_Done! See [pine delete attachments on save patch](pine_delete_attachments_on_save_patch) and [pine remove trailing quote patch](pine_remove_trailing_quote_patch)._**] * I use [GeoBytes](http://geobytes.com/) to do [geocoding](geocoding) on my [voyeurism](/ryan.barrett.name/voyeurism.shtml) page. It's great, except that it occasionally [shows popup ads](http://geoup.com/GeoPhrase.htm#HowCanThisBeFree). So, I'd like to find a geocoding service that's ad-free and switch to it. * [Google Keys](http://labs.google.com/keys/) provides keyboard shortcuts for Google search, which is quite cool...but it's not supported any more. Write a [GreaseMonkey](http://greasemonkey.mozdev.org) script that does the same thing. \[**_Done! See [Google Search Keys](http://www.imperialviolet.org/page24.html#e479)._**] * Contribute to [acoc](http://www.caliban.org/ruby/acoc.shtml), 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](acoc_conf_for_context_diffs)._**] * Write [GreaseMonkey](http://greasemonkey.mozdev.org/) scripts for GMail to address the [reasons I haven't switched from Pine](gmail_vs_pine). Specifically, add more keyboard shortcuts, cursor management, and [trailing quotes](pine_remove_trailing_quote_patch). (Inspired by [Humane Gmail autosave](http://hirevito.com/greasemonkey/humanegmailautosave.html) and Mihai Parparita's [skinning](http://persistent.info/archives/2004/10/05/gmail-skinning), [persistent searches](http://persistent.info/archives/2005/03/01/gmail-searches), and extra keyboard shortcuts.) \[**_Somewhat done...see these [GMail GreaseMonkey scripts](http://dunck.us/collab/GreaseMonkeyUserScripts#head-2b681c0a24baff8899d7163cc7f805c75e1f44e4)._**] * Implement [tuplespaces](http://www.almaden.ibm.com/cs/TSpaces/) in Python. \[**_Done! See [PyLinda](http://www-users.cs.york.ac.uk/~aw/pylinda/)._**] * Add SSL and [GSSAPI](http://www.faqs.org/faqs/kerberos-faq/general/section-84.html) authentication to Python's [imaplib](http://docs.python.org/lib/module-imaplib.html). * Use the newly GSSAPI-capable imaplib to rewrite [folderstat](folderstat) so it can talk to my mail server. * Work on [synchronizing mp3 playback](synchronizing_mp3_playback). We [took a stab](p4) 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](http://developer.apple.com/darwin/projects/bonjour/) (aka [ZeroConf](http://zeroconf.org/)). **\[_Done...as much as it can be. See [p4sync](synchronizing_mp3_playback)._]** * Add internet multiplayer to [Baku Baku](http://en.wikipedia.org/wiki/Baku_Baku_Animal), one of the best games ever written. This might require a complete rewrite...maybe with [PyGame](http://pygame.org/)? * It's widely acknowledged that bandwidth is increasing faster than latency. [David Patterson](http://www.cs.berkeley.edu/~pattrsn/) at Berkeley has a [writeup](http://roc.cs.berkeley.edu/retreats/winter_04/posters/pattrsn_BWv1b.doc) [(html)](http://216.239.63.104/search?q=cache:B5cT4nwYAsEJ:roc.cs.berkeley.edu/retreats/winter_04/posters/pattrsn_BWv1b.doc) 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. * Add an _xfn:_ operator to Google for searching [XFN](http://gmpg.org/xfn/) links, similar to the way the _site:_ operator searches specific sites. **_\[Done! See [RubHub](http://rubhub.com/) and [XhtmlFriends](http://xhtmlfriends.net/). They're not Google, but they're good enough.]_** * 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](http://toolbar.google.com/) 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](http://www.acmqueue.com/modules.php?name=Content&pa=showpage&pid=242&page=1) and [IBM's autonomic computing](http://www.research.ibm.com/autonomic/)). 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](http://pidgin.im/) (formerly [Gaim](http://gaim.sf.net/)) "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. * [Pidgin](http://pidgin.im/) (formerly [Gaim](http://gaim.sf.net/)) plugins can provide their own preferences panes, but only if they're written in C. Hack on Pidgin to allow this for Perl plugins too. See [this email thread](http://sourceforge.net/mailarchive/message.php?msg_id=7225698). * Contribute to [SIP/SIMPLE](http://xml.coverpages.org/ni2003-10-31-a.html), the [IETF](http://ietf.org/) instant messaging/presence standard. Check on the status of Pidgin's SIP/SIMPLE protocol plugin? * 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](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](http://ieee.org/) or [IETF](http://ietf.org/) is already looking into this, but I can't find the working group. * Work on [GNUnet](http://ovmj.org/GNUnet/), a strikingly practical, general-purpose overlay network with some really smart people behind it. (It's discussed relatively often on [p2p-hackers](http://zgp.org/mailman/listinfo/p2p-hackers).) * Build a solid, open [SNTP library](libmsntp). Implementations exist, both servers and clients, but they're either [not embeddable](http://www.citi.umich.edu/u/rees/pilot/) (ie [Java](http://www.kcmultimedia.com/jsntp/), [C#](http://www.dataman.ro/sntp/default.asp), [VB](http://www.vbxtras.com/products/sntpwizard.asp)) or [closed source](http://www.netcplus.com/netcclock.html) ([lots](http://www.oneguycoding.com/automachron/) [and](http://www.unchanged.net/Software/SNTP/) [lots](http://www.beaglesoft.com/clwamixplatform.htm) [of](http://www.dillobits.com/sntp_service.html) [these](http://www.timetools.co.uk/)). A couple open source command-line utilities could be good starting points: [DJB](http://cr.yp.to/djb.html)'s prickly, client-only [clockspeed](http://cr.yp.to/clockspeed.html) and [Cambridge](http://cam.ac.uk/)'s much more hacker-friendly [msntp](http://www.hpcf.cam.ac.uk/export/). \[**_Done! See [libmsntp](libmsntp)._**] * Work on [PicoContainer](http://picocontainer.org/) and [NanoContainer](http://nanocontainer.org/), tools for loosely coupled software engineering. (Technically, they're implementations of the ["inversion of control" and "dependency injection"](http://www.martinfowler.com/articles/injection.html) patterns.) As a start, add Python support.