Ryan Finnie

Blog Post

Article posted on Nov 13

AirPrint and Linux

  • Posted by Ryan Finnie on November 13, 2010, 12:58 am

I've been trying the iPhone OS[1] 4.2 GM, and decided to play with the AirPrint functionality. However, Apple has removed the ability to print to locally attached PC/Mac printers with the final versions of iTunes 10.1 and OS X 10.6.5. Using a beta version of iTunes 10.1 for Windows, Wireshark, avahi-discover and a few other tools, I managed to get an understanding of how AirPrint works. What I've found is:

  • AirPrint uses IPP for print management.
  • AirPrint listens to mDNS (Bonjour/Avahi) for printer discovery.
  • AirPrint requires a _universal subtype to be present in the _ipp announcement before it will consider listing the printer.
  • AirPrint requires an additional TXT record, "URF", to be present and non-empty before it will consider listing the printer.
  • While this URF format (see below) appears to be a future option for Apple, all current AirPrint-enabled apps seem to send print data as PDF.
  • When a printer is protected by a username/password, the iTunes/AirPrint daemon will send a TXT record "air=username,password".

The original announcement as sent by iTunes 10.1 Beta 2 for Windows looked mostly like a normal IPP announcement, except for the _universal subtype (which standard CUPS does not seem to send), and the following TXT records:

pdl=application/pdf,image/jpeg,image/urf
URF=W8,DM1,CP255,RS600-300
air=username,password

(The last record is a literal string "username,password", not an obfuscated user/pass.)

I haven't been able to find much info about what "URF" is. I'm guessing a raster format of some kind. The CUPS implementation in the iTunes beta is accepting it though. What I found is that the image/urf type is not required to be in the pdl record. Currently, all AirPrint enabled apps seem to be fine with sending PDFs, so as long as your CUPS daemon has a PDF filter, you're good. What IS required is the URF record. It has to exist, and cannot be empty, or the printer does not show up in the AirPrint list. The "air" record seems to exist to provide a hint to AirPrint that the target requires a login. If your printer target is not protected by a login, this record can be omitted.

So, with this known, how do we set up a Linux (or presumably *BSD) server as an AirPrint server? We're going to have to manually set up an Avahi service. CUPS can publish to Avahi, but as this requires an extra record and subtype that CUPS does not provide, we'll have to duplicate the printer record manually.

Note that most of this is Debian-centric. If you are not running Debian, you'll probably have to adjust things here and there.

1. Install CUPS and make sure it's actually working. Configuring CUPS correctly is outside the scope of this guide. You will need to have a PDF filter working correctly. Debian seems to provide this out of the box with a CUPS install; your mileage may vary.

2. Go into the CUPS interface and make sure "Share published printers connected to this system" is enabled.

3. Install avahi-daemon and make sure it is running. Restart CUPS to get it to publish printer services. (AirPrint will not be using the CUPS-published services, but we will need them to recreate a manual service.)

4. On another Linux box, install avahi-discover and run it from a terminal. Click the printer you wish to duplicate. Now switch back to the console and a set of debugging lines should be printed similar to this (I've added some linebreaks for readability):

Service data for service 'HP LaserJet 1200 @ nibbler.xn--n3h' of type '_ipp._tcp' in domain 'local' on 3.0:
    Host nibbler.local (10.9.8.1), port 631, TXT data: [
        'pdl=application/pdf,application/postscript,application/vnd.cups-raster,application/octet-stream,image/png',
        'Copies=T',
        'Duplex=T',
        'Binary=T',
        'Transparent=T',
        'printer-type=0x3056',
        'printer-state=3',
        'product=(GPL Ghostscript)',
        'note=Home',
        'ty=HP LaserJet Series PCL 4/5, 1.3',
        'rp=printers/hp1200',
        'qtotal=1',
        'txtvers=1'
    ]

5. Back on the server, create /etc/avahi/services/name.service. name can be anything; I named it /etc/avahi/services/hp1200.service in this case.

6. Create an XML file similar to the example below, using the data above as the values. Note that the data is in the opposite order of what avahi-discover gave it to you.

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">AirPrint hp1200 @ %h</name>
<service>
       <type>_ipp._tcp</type>
       <subtype>_universal._sub._ipp._tcp</subtype>
       <port>631</port>
       <txt-record>txtvers=1</txt-record>
       <txt-record>qtotal=1</txt-record>
       <txt-record>rp=printers/hp1200</txt-record>
       <txt-record>ty=HP LaserJet Series PCL 4/5, 1.3</txt-record>
       <txt-record>note=Home</txt-record>
       <txt-record>product=(GPL Ghostscript)</txt-record>
       <txt-record>printer-state=3</txt-record>
       <txt-record>printer-type=0x3056</txt-record>
       <txt-record>Transparent=T</txt-record>
       <txt-record>Binary=T</txt-record>
       <txt-record>Duplex=T</txt-record>
       <txt-record>Copies=T</txt-record>
       <txt-record>pdl=application/pdf,application/postscript,application/vnd.cups-raster,application/octet-stream,image/png</txt-record>
       <txt-record>URF=none</txt-record>
</service>
</service-group>

The only differences are 1) I named the service "AirPrint hp1200" to not interfere with the "hp1200" service that CUPS publishes, and 2) the added "URF=none" record. And be sure to double check that "application/pdf" is included in the pdl record. If it's not there, don't simply try to add it, that won't work. You'll need to figure out why your CUPS installation doesn't have a PDF filter.

7. Save the file. avahi-daemon should notice the new file and load it without a needed restart.

8. On your iPhone/iPad, go into an application (Safari, for example), print, and search for printers. Your new printer definition should be in there.

9. Print!

10. (Optional) Wonder why you're still printing things in 2010, let alone from a mobile device. For me, this was mostly an exercise in figuring out how AirPrint worked. The example printer used here, an HP LaserJet 1200, was bought used as a demo/display model from an office supply store in 2002. I print maybe 10 pages per year on it. 8 years later, and the original demo toner cartridge is still working fine.

--

[1] I've been working with Cisco IOS for over 10 years now, and flat out refuse to call this "iOS". Live with it.

  • 63 Comments
  • Posted in Uncategorized
  • Tags: planet:canonical

63 Responses to “AirPrint and Linux”

Newer Comments »
  1. tjfontaine says:
    November 20, 2010 at 8:17 pm

    Taking the clues provided in your excellent description, I wrote a simple one-off to generate the service files http://www.atxconsulting.com/blog/tjfontaine/2010/11/21/automatically-generate-airprint-avahi-service-files-cups-printers

    Reply
  2. Josh says:
    November 21, 2010 at 5:52 pm

    Hey, so... this is almost working for me, except that the print center is just looping between starting the job and trying to send it, and nothing is getting printed. I set this up on my Ubuntu box, and its trying to point to a Brother Printer which is actually hooked up to a Windows computer through a MacBook.. i think that complexity could have something to do with the failure though.

    AirPrint Brother HL-5140 @ %h

    _ipp._tcp
    _universal._sub._ipp._tcp
    631
    txtvers=1
    qtotal=1
    rp=printers/BrotherHL_5140
    ty=Brother HL-5140 series CUPS
    note=Main Room
    product=(HL-5140 series)
    printer-state=3
    printer-type=0xB046
    Transparent=T
    Binary=T
    Duplex=F
    Copies=T
    pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png
    URF=none

    Reply
  3. Steve says:
    November 22, 2010 at 8:21 am

    It might be because the printer is on another computer (different than the one you're advertising). You will have to add / edit the "host-name" in your new service to point to the printer or computer.

    Reply
  4. LisaNet » Blog Archiv » AirPrint freischalten – ohne den Hack mit urftopdf says:
    November 22, 2010 at 2:23 pm

    [...] Nachdem ich etwas im Netz herum gesucht habe, bin ich auf die folgende Seite gestossen: http://www.finnie.org/2010/11/13/airprint-and-linux. Dort wird beschrieben, wie man mit einem Linux-Rechner AirPrint ermöglicht. Und das hat mein [...]

    Reply
  5. Josh says:
    November 22, 2010 at 3:23 pm

    Alright, I'll see what happens. I wish Apple would just add back this feature they promised!

    Reply
  6. Josh says:
    November 22, 2010 at 4:59 pm

    Nope, I set up a local PDF virtual printer and tried sharing it with no luck (using cups-pdf) the iPad just flicks between "status | Waiting" and "status | Printing 1 of 2..." with no effect. It looks to me like its having trouble connecting to my ubuntu desktop.. but i've got printer sharing turned on so far as i can tell.

    Reply
  7. Stampare da iPad/iPhone su Gnu/Linux con AirPrint | Crisis says:
    November 22, 2010 at 6:00 pm

    [...] spunto, con qualche aggiunta personalizzata, lo ha dato questo articolo in cui l’autore ha spippolato con Wireshark per esaminare il dialogo in rete di AirPrint, per [...]

    Reply
  8. Josh says:
    November 22, 2010 at 6:54 pm

    I had to add ServerAlias * into the cupsd.conf file.

    Reply
    • J Smith says:
      June 13, 2011 at 1:37 am

      I would like to second Josh's post, on Ubuntu 11.4 I had to add "ServerAlias *" to /etc/cups/cupsd.conf

      /var/logs/cups/error_log was showing the following error (redacted):

      Request from "" using invalid Host: field ".local"

      It is probably better to specify the ServerAlias using "ServerAlias .local" (or whatever the hostname was) as described in the CUPS documentation http://www.cups.org/documentation.php/doc-1.5/ref-cupsd-conf.html#ServerAlias

      Reply
  9. micromux » AirPrint for Mac on Linux says:
    November 22, 2010 at 8:04 pm

    [...] to Ryan Finnie for his initial research and TJ Fontaine for a fabulous script that automates the services [...]

    Reply
  10. maxxfi says:
    November 22, 2010 at 11:57 pm

    "I've been working with Cisco IOS for over 10 years now, and flat out refuse to call this "iOS". Live with it."

    God bless you! :-D

    Reply
  11. steven stern says:
    November 23, 2010 at 7:24 am

    Using the script at http://www.atxconsulting.com/blog/tjfontaine/2010/11/21/automatically-generate-airprint-avahi-service-files-cups-printers, I created the service file. I can now "print" from my phone, nothing actually prints. I'm on the right track, but it's not quite there yet.

    Reply
  12. Neil says:
    November 23, 2010 at 10:55 am

    Thanks. Very useful. Your file also worked without changes for my LaserJet 1020.

    Reply
  13. Pete says:
    November 24, 2010 at 5:07 am

    Wonderful! Works perfectly on Gentoo for my Samsung CLP-325 networked via a Sitecom print server. Thank you.

    Reply
  14. Josh says:
    November 24, 2010 at 10:52 am

    @steven, make sure you've actually gone and configured your cupsd.conf file. The vanilla copy won't work for this. You definitely need ServerAlias * to be in there and then some other stuff might be needed

    Reply
  15. marvin says:
    November 24, 2010 at 11:41 pm

    Didn't work for me, running ubuntu 10.4. Looks like it works from the iPhone side, but nothing ever gets into the print queue. CUPS access log shows a Get-Printer-Attributes call with a 200 success, but just one line (from an ipv6 origin). When I print from a windows machine (to the same cups printer) I see many more lines in the access log with an ipv4 origin. lpr sample.pdf works fine. tj's script worked fine. What else can I check, look into?

    Reply
  16. Christian says:
    November 25, 2010 at 12:43 am

    Magnifique,

    Cela fonctionne très bien avec une Gentoo.

    Attention :
    - au bug de pdftops avec net-print/cups-1.3.11-r1 (http://bugs.gentoo.org/show_bug.cgi?id=309901) sur la gentoo.
    - aux droits d'accès à Cups dans le cupsd.conf (en particulier les allow/deny)

    Sinon, la manip est bien décrite et documentée => encore Merci Ryan.

    Christian

    Reply
  17. LP says:
    November 25, 2010 at 11:17 am

    Works great(iPad-> Debian and MacBook -> Debian) , but the print job sure takes a long time to start. As far as I can tell the delay is on the client side (tcpdump shows no traffic on the Debian side). Anyone else having the same issue?

    Reply
  18. AirPrint – minden operációs rendszerről | iFun.hu says:
    November 25, 2010 at 3:31 pm

    [...] hogy a következő linken találunk megoldást arra is, hogy Linux alól hogy engedélyezzük az AirPrint [...]

    Reply
  19. Nick's Ramblings » Blog Archive » AirPrint using Ubuntu server and a network printer says:
    November 26, 2010 at 7:50 am

    [...] of what follows is based on a blog entry from Ryan Finne with added help from a blog entry by tjfontaine. And I won’t repeat their great work here. [...]

    Reply
  20. Nick says:
    November 26, 2010 at 7:53 am

    Just wanted to say thanks and share my experience on setting this up.

    http://fiorellonj.com/wp/2010/11/airprint-using-ubuntu-server-and-a-network-printer/

    Reply
  21. Rune says:
    November 30, 2010 at 1:17 pm

    Canot run python script :(

    "Failed to find python libxml or elementtree"

    Can someone help - or maybe if you have the service file for Canon Pixma iP5300?

    Reply
  22. Frank says:
    November 30, 2010 at 4:29 pm

    Does AirPrint only use multicast mDNS or also Unicast DNS-SD? We're trying to make it work on an enterprise network without allowing broadcasts across subnets.

    Reply
  23. Jim says:
    December 4, 2010 at 10:41 am

    Thanks very much for the article and to the people who suggested adding the ServerAlias * to cups.conf. Did that and I could print!

    Reply
  24. Peter says:
    December 15, 2010 at 7:28 am

    How Conserns

    Manually adding DNS-SD printer service discovery records for AirPrint to an existing name server.

    See: http://www.dns-sd.org/ServerStaticSetup.html

    _universal._sub._ipp._tcp PTR prn._ipp._tcp
    _ipp._tcp PTR prn._ipp._tcp
    prn._ipp._tcp SRV 0 0 631 cups..tld.
    TXT "URF=none" "txtvers=1" "qtotl=1" \
    "rp=printers/" \
    "ty=Fiery X3eTY 35C-KM PS Color Server v2.01 eu" \
    "product=(Fiery X3eTY 35C-KM PS v2.01 eu)" \
    "transparent=t" "copies=t" "duplex=t" "color=f"\
    "pdl=application/pdf,application/postscript" \
    "note=Campus, Building, Floor, Hall"

    Regards Peter

    Reply
  25. kelo says:
    December 17, 2010 at 10:52 am

    Hi,

    thanks a lot very usefull tutorial, i have my debian with cups 1.3.8 and avahi now printing on my samsung ML-2010 from the iphone. I don't understand how to protect the printer with login and password the txt record "air=username,password" when used put a lock icon on the printer when listed in the iphone but no credentials are asked when printing. Anyone used this record with succes?

    Thanks

    k.

    Reply
  26. printing to an AirPrint printer from Android - Question Lounge says:
    December 31, 2010 at 5:55 pm

    [...] it appears to be a fairly simple protocol employing Internet Printing Protocol, bonjour and PDF:http://www.finnie.org/2010/11/13/airprint-and-linux/These technologies all appear to be possible to implement on Android, but I’m wondering if [...]

    Reply
  27. AirPrinting to CUPS « Eric's Blog says:
    January 27, 2011 at 8:14 pm

    [...] out a better solution, at least if you run a printserver with cups.  Ryan Finnie’s blog has a great writeup on what it takes – just a printserver with a pdf filter, and an mDNS advertisement of the [...]

    Reply
  28. Hands on: iPad printing with 4.2 and AirPrint, a limited menu says:
    February 12, 2011 at 2:18 am

    [...] swapping the files seems like overkill, a German blogger took note of Ryan Finnie’s approach to enabling AirPrint sharing from Linux and built an AppleScript to make the necessary configuration change (one line!) in CUPS. All of [...]

    Reply
  29. Andre says:
    February 14, 2011 at 5:27 am

    I am guessing that URF stands for "Universal Raster Format". Doing a web search on that shows that it could well be that. See the following article:

    http://www.mail-archive.com/lprng@lprng.com/msg06114.html

    Reply
  30. Andre says:
    February 14, 2011 at 5:32 am

    @kelo: I would check on the CUPS site to see what is documented: http://www.cups.org/

    Reply
  31. 用 Ubuntu 做 AirPrint 服务器实现 iOS 无线打印 | Doggie! says:
    February 20, 2011 at 3:31 am

    [...] 有个零配置的网络工具,叫做 Avahi,用它可以方便地创建各种 IP 服务。牛人 Ryan Finnie 告诉我们,AirPrint 大概和 IPP 广播差不多,除了多一个 _universal subtype 和一个 TXT [...]

    Reply
  32. Neal says:
    April 1, 2011 at 1:33 pm

    Does this still work on 4.3? I've tried this (and airprint for windows) and both come up with "No Printers Found" even though i see MDNS standard query coming from iphone/ipad and MDNS Standard query Response.

    No idea why it won't work (linux cups or windows airprint.exe).

    Thx.

    Reply
  33. Neal says:
    April 1, 2011 at 1:34 pm

    FYI.. those responses are in Wireshark (sniffer). Phone is asking, and servers are responding. I never tried this with 4.2.x but 4.3 isn't working right now for me.

    Reply
  34. Russ says:
    April 10, 2011 at 9:59 pm

    Thanks, this blog and tjfontaine's python script made it a breeze to print to my network attached Dell 1700n from my iPad WiFi (1st Gen) w/ iPhone OS 4.3.1 by way of my Ubuntu 10.04.2 LTS box.

    Reply
  35. Matthias says:
    April 26, 2011 at 6:07 am

    Does not work for me either with ios 4.3.2. Worked with ios 4.2.x. Anyone got an idea what is wrong with ios 4.3

    Reply
  36. Matthias says:
    April 29, 2011 at 12:59 am

    I just found out that you need to enable and disable flight mode to reset the WLAN connection. Then the iphone was able to find the printer. It seems that the bonjour service of the device does a complete rescan only if the wlan is freshly activated. Saw some reports of that in different boards.

    Reply
  37. Swift says:
    May 10, 2011 at 6:40 am

    The only thing I had to change because of my LAN setup is to add the line:
    ServerAlias *
    somewhere in /etc/cups/cupsd.conf Otherwise I got bad request errors bevause the iPad used a server name that cups refused to validate. Certainly due to my LAN setup. Hope this could help some of you.

    -Swift

    Reply
    • Patrick says:
      June 13, 2011 at 3:46 pm

      I had the same problem. Once I added "ServerAlias *" to the top of my /etc/cups/cupsd.conf file, it started to work.

      I also used the script provided in the first comment to generate my service file. It wouldn't work initially. In case anybody else gets stuck, I had to install python-cups before running the script.

      Reply
  38. Till Kamppeter says:
    June 7, 2011 at 4:52 am

    Thank you very much for these instructions. They helped me to patch the CUPS packages in Ubuntu Natty (11.04, will come with next update) and Oneiric (11.10) to automatically advertize printers via DNS-SD in a way to be found and accepted by AirPrint clients, without any additional service definition file. You only need to share your printers. See https://bugs.launchpad.net/bugs/711779.

    Till

    Reply
  39. sdbillin.kicks-ass.org » Blog Archive » Airprint from iphone/ipad on Ubuntu says:
    June 14, 2011 at 3:07 am

    [...] off, follow this guide up to step 6 Next, generate the XML using the script from this page Now carry on with the first [...]

    Reply
  40. Como imprimir no iPad | BR-Mac.org says:
    June 24, 2011 at 5:26 am

    [...] AirPrint no Linux [...]

    Reply
  41. Ubuntu 11.04 And Ubuntu 11.10 To Support Apple AirPrint says:
    June 29, 2011 at 4:25 am

    [...] patch is based on Ryan Finnie’s work on AirPrint support on Linux. Finnie discovered that AirPrint can be made to work on Linux by doing [...]

    Reply
  42. schooney says:
    July 8, 2011 at 8:35 am

    Hey everybody,

    first of all: thank you very much, it's such a great tutorial, everything works fine with my Epson printer. But I plan to share a Virtual PDF Printer working with cups-pdf for my iPad, too.

    My question: I just modified my skript for the Epson and I changed the same fields I did for the Epson with you suggestion above, but my devices still don't find it! I make a new service-file. Is the Problem that avahi only can handle with one file?

    Here is my script for the Virtual PDF-Printer, maybe there a some mistakes, I'm a real Newbie on text-based Linux, sorry ;)

    PDF Printer

    _ipp._tcp
    _universal._sub._ipp._tcp
    631
    txtver=1
    qtotal=1
    rp=printers/PDF_Printer
    ty=>PDF Printer
    adminurl=http://192.168.2.82:631/printers/PDF_Printer</txt-reco
    note=>>
    priority=0
    product=PDF Printer
    printer-state=3
    printer-type=0x801046
    Transparent=T
    Binary=T
    Fax=F
    Color=T
    Duplex=F
    Staple=F
    Copies=F
    Collate=F
    Punch=F
    Bind=F
    Sort=F
    Scan=F
    pdl=application/octet-stream,application/pdf,application/postsc
    URF=W8,SRGB24,CP1,RS600

    Reply
  43. Greg Hoerner says:
    July 13, 2011 at 4:06 pm

    THANK YOU!!! This walk through is awesome, worked right off the bat using an iPod touch, iOS 5 Beta 2, CentOS 5.6 Server & Ricoh Aficio CL3500N Printer!

    Reply
  44. Mister Shiney says:
    September 21, 2011 at 4:48 pm

    Ok this is an awesome guide you have here, thank you. One stumbling block I found was that I have firestarter (Ubuntu firewall for dummies) and it was preventing my ipad from seeing the printers. After a lot of messing about I discovered reference to multicast being blocked by firestarter by default. Through trial and error I found this solution:
    1. Edit /etc/firestarter/firewall
    2. Comment out these lines:
    $IPT -A INPUT -s 224.0.0.0/8 -d 0/0 -j DROP
    $IPT -A INPUT -s 0/0 -d 224.0.0.0/8 -j DROP
    $IPT -A OUTPUT -s 224.0.0.0/8 -d 0/0 -j DROP
    $IPT -A OUTPUT -s 0/0 -d 224.0.0.0/8 -j DROP

    After restarting firestarted I found I could still print, even though the firewall was active. Anyway, thought this tidbit might be helpful to your readers.

    Reply
  45. Jay says:
    October 5, 2011 at 9:11 am

    Dude, you rock! As a Linux noob, this was easy enough. Now, here it is 2011. Why are we printing?

    1) Kids reports - yes, schools should allow electronic submissions - will probably happen by the time my great grandchildren get to school
    2) Coupons stores need - yes, they should allow e-coupons and scan at the checkout, but most don't
    3) Mailing labels
    4) Recipes - yes I do want a recipe service to submit directly to MasterCook on the PC, but until then...

    Any others?

    Reply
  46. Matt says:
    October 15, 2011 at 9:50 am

    Can you confirm if this still works on iOS 5? Lots of people are doing the Windows equivalent of this with the utility at http://jaxov.com/2010/11/download-airprint-installer-for-windows-7-xp-vista. They are reporting iOS 5 incompatibility. Some are even saying that AirPrint doesn't work with certain canon and hp printers natively after the ios5 update.

    Since it looks like you have dug further into tracing the protocol, can you tell if Apple changed something for iOS 5? Perhaps something new in the URF header?

    Thanks.

    Reply
  47. Matze says:
    November 21, 2011 at 1:06 pm

    Hello ! Thanks for the Great Description . It worked very well since i updated my iPhone to iOS 5.

    Are there any known solutions ?

    Greetings,
    Matze

    Reply
  48. pastro50 says:
    November 25, 2011 at 8:05 pm

    On IOS5 using Ubuntu 10.04 LTS this works but only if I setup a cron job to touch the appropriate .services file every minute. As soon as the file is touched the printer shows up again. Otherwise it says no airprint printers found. Seems like there might be something with avahi that isn't quite right. Anyone have any ideas?

    Reply
  49. Jon says:
    January 1, 2012 at 12:26 pm

    I just tried this with Ubuntu 11.10 and found that I don't need to create the service file. I'm using IOS5 on my iPod Touch and once I have cups setup to publish, it all just works.

    Reply
  50. Network-wide AirPrint and easy printer configuration through DNS-SD | mLearning says:
    February 1, 2012 at 12:44 am

    [...] Advertisement over Bonjour that includes specific records. [...]

    Reply
Newer Comments »

Leave a Reply

Click here to cancel reply.

If you have an OpenID, you may fill it in here. If your OpenID provider provides a name and email, those values will be used instead of the values here. Learn more about OpenID or find an OpenID provider.

« 2010 Apple TV: Mediocrity to the extreme
vanityhash: Brute forcing hashes for fun and profit »

Ryan Finnie

  • Résumé (PDF)
  • Finnix
  • Debian
  • Launchpad
  • OpenPGP

Site Search

Categories

  • Chef Fo0bar Presents (15)
  • Finances (17)
  • Finnix (20)
  • Hampr (6)
  • Reviews (5)
  • Uncategorized (827)

Blog Search

Powered by WordPress.