blog: Wrote upload and indexing script.
authorWerner Koch <wk@gnupg.org>
Wed, 10 Dec 2014 14:05:50 +0000 (15:05 +0100)
committerWerner Koch <wk@gnupg.org>
Wed, 10 Dec 2014 15:04:42 +0000 (16:04 +0100)
See the README file for details.

.gitignore
README
misc/blog.gnupg.org/index.html [deleted file]
misc/blog.gnupg.org/index.org [new file with mode: 0644]
misc/blog.gnupg.org/upload
web/share/gpgweb.el

index 7cd9006..a2ea2ee 100644 (file)
@@ -8,3 +8,5 @@ stage/
 /web/faq/gnupg-faq.txt
 /web/swdb.lst
 /web/swdb.lst.sig
+/misc/blog.gnupg.org/index.html
+/misc/blog.gnupg.org/20*.html
diff --git a/README b/README
index a3224d5..0d6069c 100644 (file)
--- a/README
+++ b/README
@@ -68,3 +68,35 @@ for d in $(find . -type d); \\
   A cronjob needs to run mkkudos.sh to update the list of donors.
   This can be done every few minutes becuase mkkudos won't do anything
   if the list of donors has not been updated.
+
+** Writing a blog entry
+
+  The misc/blog.gnupg.org directory is used for the blogging system.
+  On the web server it is symlinked to /blog/.  To build and upload all
+  blogs you cd to misc/blog.gnupg.org and run the command ./upload.
+  This renders the org files into html, builds an index, and uploads
+  the html files to the web server.  Emacs and a decent org-mode are
+  required (tested with org-mode 8.2.7).
+
+  To add a new blog entry, decide on the publication date and create
+  a file
+
+    YYYYMMDD-short-headline.org
+
+  for example "20141030-what-happened-this-month.org".  Unless you
+  translate an existing entry do not use a file name which ends in
+  ".??.org".  The file itself is a standard org file using these
+  conventions:
+
+  ===== 8< =========
+  # Comment
+  #+AUTHOR: Werner
+  #+DATE: 30th October 2014
+
+  ** What happened in October 2014
+
+  Blurb
+  ===== >8 =========
+
+  AUTHOR and DATE are used to construct the "Posted at" info.  The
+  headline needs to start at level 2.
diff --git a/misc/blog.gnupg.org/index.html b/misc/blog.gnupg.org/index.html
deleted file mode 100644 (file)
index 4e4849f..0000000
+++ /dev/null
@@ -1,886 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <title>Blog - GNU Privacy Guard</title>
-  <link href="site.css" rel="stylesheet" />
-</head>
-<body>
-<table class="layout" cellspacing="30" summary="">
-<col width="20%" /><col width="80%" />
-<tbody>
-  <tr id="top-page">
-  <td class="layout" colspan="2">
-  <table class="frame" width="100%" summary="">
-  <col width="30%" /><col width="*" /><col width="30%" />
-  <col width="23" />
-<tbody>
-  <tr>
-    <td class="frame-head">&nbsp;</td>
-    <td class="frame-head">
-      <a href="http://gnupg.org"
-         ><img src="logo-gnupg-light-purple-bg.png" alt="[GnuPG Logo]"
-               width="356" height="120" /></a></td>
-    <td class="frame-head">&nbsp;</td>
-    <td class="frame-right">&nbsp;</td>
-  </tr>
-  <tr>
-    <td class="frame-bottom-lang">&middot; English &middot; &nbsp;</td>
-    <td class="frame-bottom-lang">&nbsp;</td>
-    <td class="frame-bottom-mirror">&nbsp;</td>
-    <td class="frame-corner">&nbsp;</td>
-  </tr>
-</tbody>
-</table>
-</td>
-</tr>
-<tr>
-  <td class="layout">
-    <table class="frame" width="100%" summary="">
-      <col width="*" /><col width="23" />
-      <tbody>
-       <tr>
-         <td class="frame-navb">Links
-           <ul class="frame-navb">
-             <li class="frame-navb"><a href="index.html">Blog</a></li>
-             <li class="frame-navb"><a href="/index.html">GnuPG</a></li>
-           </ul>
-         </td>
-         <td class="frame-right">&nbsp;</td>
-       </tr>
-       <tr>
-         <td class="frame-bottom">&nbsp;</td>
-         <td class="frame-corner">&nbsp;</td>
-       </tr>
-       <tr>
-         <td class="frame-spacing">&nbsp;</td>
-       </tr>
-      </tbody>
-    </table>
-  </td>
-
-  <td class="layout">
-    <table class="frame" width="100%" summary="">
-      <col width="*" /><col width="23" />
-      <tbody>
-       <tr>
-         <td class="frame-cont">
-
-<!-- Begin Content -->
-
-<h1>GnuPG Blog</h1>
-
-<div class="entry">
-  <a href="20140512-rewards-sent.html">
-  <h2>Goteo Campaign: Preliminary Results</h2>
-  </a>
-  <h5>Posted May 12, 2014 by Werner</h5>
-
-  <p>
-  Here is a quick campaign status update: After the t-shirts arrived as
-  expected the week after Eastern, Mechthilde, Michael, Penny, Rainer,
-  and me met the other day at the FSFE office in Düsseldorf.  Due to
-  Rainer’s excellent preparation we quickly folded, enveloped, and
-  stamped about 300 t-shirts and snailed them.  Kudos to them for
-  helping with this task.  There are still a few t-shirts we have not
-  been able to sent because some of our contributors did not reply to
-  several mails asking for missing address details, or the postmaster
-  returned them due to faulty addresses.  If you expected a t-shirt and
-  did not receive one, please contact me at accounts at GnuPG dot net.
-  Most of the stickers have also been snailed but a few are still
-  pending due to uncertain addresses.
-  </p>
-
-  <p>
-  The main <a href="https://www.gnupg.org">GnuPG site</a> is now
-  accessible via TLS and plain http access is redirected to the https
-  address.  Strict Transport Security (HSTS) has also been enabled.
-  In the case of problems with TLS the site may still be accessed
-  non-encrypted via
-  <a href="http://www.tla-friendly.gnupg.org">http://www.tla-friendly.gnupg.org</a>.
-  </p>
-
-  <p>
-  To accomplish another promise of the campaign, the website may now be
-  accessed as TOR hidden service at
-  <a href="http://ic6au7wa3f6naxjq.onion">http://ic6au7wa3f6naxjq.onion</a>. Being
-  a well known and intentionally public site, it does not make much
-  sense to have it as a hidden service.  However, if the site is to be
-  accessed anyway via Tor we can avoid the extra TLS layer and and
-  allow direct access.  Note that lists.gnupg.org and some other
-  services are not available via an onion address.
-  </p>
-
-  <p>
-  Finally here are preliminary financial results of the campaign:
-  </p>
-
-  <p>
-  Our contributors donated a total of 37270 Euro. Due to card and
-  Paypal processing problems we actually received 36732 Euro.  The
-  preliminary costs for running the campaign are 18590 Euros, so
-  that 18142 Euro are available for the goals.  Here is an overview
-  of the costs:
-  </p>
-
-  <table cellpadding="2" rules="groups" frame="hsides">
-
-
-  <colgroup>
-  <col  class="left" />
-
-  <col  class="right" />
-  </colgroup>
-  <thead>
-  <tr>
-  <th scope="col" class="left">Goteo fee</th>
-  <th scope="col" class="right">2939</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">Paypal fees</th>
-  <th scope="col" class="right">1152</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">VAT</th>
-  <th scope="col" class="right">5212</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">Campaign manager</th>
-  <th scope="col" class="right">5390</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">300 t-shirts</th>
-  <th scope="col" class="right">1852</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">Envelopes + postage t-shirts</th>
-  <th scope="col" class="right">996</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">Rewards for helper</th>
-  <th scope="col" class="right">102</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">360 Stickers</th>
-  <th scope="col" class="right">342</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">Envelopes + postage sticker</th>
-  <th scope="col" class="right">210</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">Campaign server for 5 months</th>
-  <th scope="col" class="right">395</th>
-  </tr>
-  </thead>
-  <tbody>
-  <tr>
-  <td class="left">&#xa0;</td>
-  <td class="right">18590</td>
-  </tr>
-  </tbody>
-  </table>
-  <p>
-  Due to missing or incomplete addresses or no response to our mails
-  we could not ship about 80 stickers and 15 t-shirts.  I spend a
-  substantial amount of time (at least 4 weeks) with direct campaign
-  related tasks, which were not included in the original plan.  That
-  plan explained how to spend the money:
-  </p>
-
-  <table cellpadding="2" rules="groups" frame="hsides">
-
-
-  <colgroup>
-  <col  class="left" />
-
-  <col  class="right" />
-  </colgroup>
-  <thead>
-  <tr>
-  <th scope="col" class="left">New website</th>
-  <th scope="col" class="right">4054</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">New content</th>
-  <th scope="col" class="right">910</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">New website design</th>
-  <th scope="col" class="right">1435</th>
-  </tr>
-
-  <tr>
-  <th scope="col" class="left">Releasing 2.1</th>
-  <th scope="col" class="right">6000</th>
-  </tr>
-  </thead>
-  <tbody>
-  <tr>
-  <td class="left">&#xa0;</td>
-  <td class="right">12399</td>
-  </tr>
-  </tbody>
-  </table>
-
-  <p>
-  The extra 5743 Euro we received will be used for general
-  maintenance, to cover the unexpected time I had to spend on the
-  campaign, and for some giveaways to long time GnuPG hackers.
-  </p>
-
-  <p>
-  Thank you very much for all your help and please keep on
-  supporting GnuPG.
-  </p>
-  <p><a class="permalink" href="20140512-rewards-sent.html"></a></p>
-</div>
-
-               <div class="entry">
-
-                       <a href="20140206-crowdfunding-complete.html">
-                               <h2>Mission complete: campaign ends, closing stats</h2>
-                       </a>
-                       <h5>Posted 6th February 2014 by Sam Tuke</h5>
-
-                       <div class="captioned-img right" style="margin-top:0;">
-                               <img src="img/funding-chart.png" />
-                               <p>Today's donation totals</p>
-                       </div>
-
-                       <p>After 50 days of crowdfunding, the <a href="http://goteo.org/project/gnupg-new-website-and-infrastructure" target="blank">GnuPG campaign</a> for new website and infrastructure will close tomorrow. That means rewards for backers can now be ordered and preparations for dispatch can begin. Here are the results so far:</p>
-
-                       <ul>
-                               <li>36.741 EUR raised out of 24.000 target</li>
-                               <li>1.081 people donated in support</li>
-                               <li>350 EUR Largest single donation</li>
-                               <li>33 EUR average donation</li>
-                               <li>365 Stickers claimed</li>
-                               <li>300 T-shirts claimed</li>
-                               <li>191 GnuPG email addresses claimed</li>
-                               <li>793 Additional Twitter followers (from 60)</li>
-                       </ul>
-
-                       <p>Goteo, the Free Software platform hosting the campaign, usually required two 40 day rounds of funding, but in our case we're ending early, after just 50 days. This will enable us to deliver the new site and GnuPG 2.1 faster, and is possible thanks to reaching our goal so quickly (in just 26 hours).</p>
-
-                       <p>We're currently preparing a system for collecting donor preferences for their rewards (sizes, addresses, etc.), so expect to be contacted in the next week or two if that includes you.</p>
-
-                       <p>Thanks again to all our backers for the overwhelming support that GnuPG has received!</p>
-
-                       <p><a class="permalink" href="20140206-crowdfunding-complete.html"></a></p>
-
-               </div>
-
-               <div class="entry">
-
-                       <div class="captioned-img right" style="margin-top:0;">
-                               <img src="img/keysigning-party-s.jpg" />
-                               <p>Keysigning at FOSDEM</p>
-                       </div>
-
-                       <a href="20140127-find-fosdem.html">
-                               <h2>Find us at FOSDEM</h2>
-                       </a>
-                       <h5>Posted 27th January 2014 by Sam Tuke</h5>
-
-                       <p>On Friday Werner and Sam are heading to <a href="https://fosdem.org/2014/" target="blank" rel="nofollow">FOSDEM</a>, the largest Free Software conference in Europe, along with many GnuPG hackers, users, and supporters. <a href="http://gnupg.totemapp.com/company" target="blank">Get in touch</a> if you'd like to talk about the existing or future campaigns while we're there.</p>
-
-                       <p>There won't be a GnuPG booth this year, but we shall be busy with meetings and mingling. Notes and contacts for us can be left at the <a href="https://fosdem.org/2014/stands/" title="Free Software Foundation Europe" target="blank">FSFE booth</a>.</p>
-
-                       <p>And don't forget that you're invited to the continent's biggest keysigning party, organised by FOSDEM volunteers. Today is the last opportunity to <a href="https://fosdem.org/2014/keysigning/" target="blank">submit your key</a>, which is necessary for participation. Get to it!</p>
-
-                       <p>Bring your ideas. See you there.</p>
-
-                       <p><a class="permalink" href="20140127-find-fosdem.html"></a></p>
-
-               </div>
-
-               <div class="entry">
-               <a href="20131230-how-good-is-goteo.html">
-                       <h2>How good is Goteo? An appraisal</h2>
-               </a>
-               <h5>Posted 30th December 2013 by Sam Tuke</h5>
-
-               <div class="captioned-img right" style="margin-top:0;">
-                       <img width="380px" src="img/goteo-pledge-wall.png" />
-                       <p>A wall of donor faces on Goteo</p>
-               </div>
-
-               <p>"One question: why did you choose the quite unknown Spanish crowdfunding site Goteo?" So shot back the reply to the <a href="http://blog.gnupg.org/20131219-gnupg-launches-crowfunding.html" target="blank">press release</a> I had just sent to a few dozen selected journalists announcing the launch of the GnuPG crowdfunding campaign. "You won't get any exposure on there, we got a few hundred thousand hits just from being on indiegogo" I was told by one experienced crowdfunder at my favourite <a href="http://www.c-base.org/" target="blank" rel="nofollow">Berlin hackerspace</a> last month. "What's Goteo?" has been one of the most frequently asked questions of this campaign from friends and supporters.</p>
-
-               <p>I ummed and ahhed over which crowfunding platform to choose. It's a decision that has a huge impact on the campaign - market exposure, transaction costs, and design and layout are just a few of the many factors that have to be taken into account. This is a crowded market - new crowdfunding sites are popping up each week as more companies try to cash in on what is recognised a key <a href="http://www.theguardian.com/technology/2013/dec/23/tech-128-from-airbnb-to-crowdfunding-the-year-in-review" target="blank" rel="nofollow">tech trend of 2013</a>. An <a href="http://www.theguardian.com/commentisfree/2013/dec/23/crowdfunding-limitations" target="blank" rel="nofollow">estimated $5bn</a> was raised by crowdfunders this year. That equates to around $35m in commission fees for the platforms hosting these campaigns, who typically charge between <a href="http://www.indiegogo.com/indiegogo-faq" title="indiegogo's commission charges" target="blank" rel="nofollow">5</a>-<a href="http://goteo.org/faq/sponsor#q98"
-               title="Goteo's commission Charges" target="blank">10%</a>. It's no surprise that everyone wants a slice.</p>
-
-               <div class="captioned-img left">
-                       <img width="180px" src="img/non-economic-goteo.png" />
-                       <p>"Non-economic donations"</p>
-               </div>
-
-               <p>Goteo however, is unique. Right now it's the only crowdfunding software that is itself <a href="https://fsfe.org/about/basics/freesoftware.en.html" target="blank">Free Software</a>, allowing everyone to inspect how it works and run their own copy. Even though I don't plan to run my own Kickstarter competitor any time soon, the fact we can check its code, make improvements, and follow the development process is really important. I want Goteo to prosper profitably because, aside from all its other good points, I know some of that profit will be invested in the platform itself, which shall remain free and accessible to everyone under the terms of the <a href="https://github.com/Goteo/Goteo/blob/master/GNU-AGPL-3.0" target="blank" rel="nofollow">AGPL3 license</a>.</p>
-
-               <p>Goteo is also the only such site to my knowledge that's built with public money. Funded by Spain's Department for Education, Culture and Sport, Barcelona's City Council, and The University of Andalucia, Goteo exists to host projects which "<a href="http://goteo.org/about" target="blank">contribute to the common good, free knowledge, and open code</a>". Everything about the platform and the projects it hosts point to common goods, shared resources, and collaborative effort.</p>
-
-               <p>Besides that, these other features make it stand out:</p>
-
-               <ul>
-                       <li>Signup and donation workflow is smooth and simple</li>
-                       <li>Great focus on social media and sharing links (we had hundreds of tweets from these)</li>
-                       <li>Users can login with many social networks, including OpenID and LinkedIn</li>
-                       <li>Clean and professional design with easy access to key information</li>
-                       <li>Built in license chooser for all "goods" projects produce (categories for software, artwork, etc.)</li>
-                       <li>Mandatory delivery timeframe / deadline setter with public calendar</li>
-                       <li>Nice "image wall widget" of donors faces has potential, provides public recognition of donations</li>
-                       <li>Web forms for project creation are comprehensive and well designed</li>
-                       <li>Crowdsourcing of extra skills ("non-economic donations") works well</li>
-                       <li>Donations are guaranteed by PayPal and Goteo, not pledged or retractable</li>
-                       <li>Goteo staff are friendly and knowledgable, providing personal guidance and assistance</li>
-                       <li>Many funding successes, including a few related to <a href="http://goteo.org/project/bhoreal" target="blank" rel="nofollow">hardware</a>, <a href="http://goteo.org/project/smart-citizen-sensores-ciudadanos?lang=en" target="blank" rel="nofollow">software</a>, and <a href="http://goteo.org/project/protolab-movil" target="blank" rel="nofollow">Hackerspaces</a></li>
-               </ul>
-
-               Many of those benefits are obvious before launching a campaign. However, on the list of problems I experienced with the platform, most weren't discovered until the point of execution (<span class="orange-text">orange</span> = fix in progress):
-
-               <ul>
-                       <li class="orange-text">User-set passwords are automatically emailed in plain text after registration (insecure)</li>
-                       <li>Rewards can't be customised, e.g. select t-shirt size</li>
-                       <li class="orange-text">Once a campaign is launched, no aspect can be edited directly (though news can be added)</li>
-                       <li>The order of images for the campaign page is random - the first image visitors see can't be specified</li>
-                       <li class="orange-text">The launch date of the campaign is chosen by Goteo administrators, it can't be specified</li>
-                       <li>No markup is available for text formatting</li>
-                       <li class="orange-text">Pictures are limited and can't be placed between text to break up the page</li>
-                       <li>There's a bug that causes double posting of news items</li>
-                       <li>Shipping for rewards is not configurable - international shipping can't be billed</li>
-                       <li>The website is not mobile friendly (minimum page width is 940px)</li>
-                       <li>HTTPS is not available to donors for transferring personal details</li>
-               </ul>
-
-               Besides that, I spotted a few opportunities for improvement:
-
-               <ul>
-                       <li>Send emails to people who didn't complete their donation ("abandoned carts" - indiegogo does this)</li>
-                       <li>Allow managers to specify the content of social media messages</li>
-               </ul>
-
-               <div class="captioned-img right">
-                       <img width="400px" src="img/goteo-github-license.png" />
-                       <p>Goteo's license on GitHub</p>
-               </div>
-
-               <p>Some of the problems listed are a real pain. Because I couldn't choose the launch date, and hadn't planned for an in-depth human review by Goteo, our project went public days later than I expected, at a time when I was travelling and without connectivity. Goteo's campaigns team is helpful and responsive however, and even in the last few weeks several translation problems have been fixed which I had previously reported. I'm confident that the other most serious issues will be addressed in a timely manner.</p>
-
-               <p>In all, we took a gamble by using Goteo, but one that paid off. It's focus on communal work and rewards is unique amongst its competitors, and when it comes to copyleft licensing they stand alone in practicing what they preach. Nearly all the convenient features that you'd expect from more established platforms are included, together with a pleasant functional interface. Donations are worry-free for both donors and recipients (though I can't comment on the final transfer process until later next month).</p>
-
-               <p>Best of all perhaps, staff at Goteo are knowledgable and supportive and have time to invest in making projects a success. And when launch day comes and you're expecting the unexpected, that's very reassuring.</p>
-
-               <p><a class="permalink"
-                       href="20131230-how-good-is-goteo.html"></a></p>
-
-               </div>
-
-               <div class="entry">
-               <a href="20131220-gnupg-turned-0x10.html"
-               ><h2>16 Years of protecting privacy</h2></a>
-               <h5>Posted 20th December 2013 by Sam Tuke</h5>
-
-               <p>
-               Today marks 16 years since the first release of GNU Privacy Guard
-               (GnuPG). In that time the project has grown from being a hacker’s
-               hobby into one of the world’s most critical anti-surveillance
-               tools. Today GnuPG stands at the front line of the battle between
-               invasive surveillance and civil liberties.
-               </p>
-
-               <p>
-               “Time has proven <a href="http://fsfe.org/freesoftware/basics/4freedoms.en.html">Free Software</a> to be the most trustworthy defender
-               against companies and governments seeking to undermine citizen
-               privacy” said Werner Koch, GnuPG Founder and Lead Developer. “Although
-               funding our work has not always been easy, the need for universally
-               accessible privacy tools has never been more apparent”.
-               </p>
-
-               <p>
-               Some of the world’s top security specialists are now counted among
-               GnuPG users, including Bruce Schneier, Jacob Appelbaum, and Phil
-               Zimmerman, inventor of PGP. This summer the world learned of the
-               extent of Government spying thanks to whistleblowers and journalists
-               communicating using GnuPG encrypted emails. Market leading servers
-               from Red Hat and Debian have built their reputation for security on
-               the foundation of GnuPG-verified software.
-               </p>
-
-               <p>
-               “The success of GnuPG’s
-               first <a href="http://goteo.org/project/gnupg-new-website-and-infrastructure"
-               >crowdfunding campaign</a>, which received 90% of it’s target in 24
-               hours, shows a fresh willingness among users to support GnuPG in it’s
-               16th year, and points to new opportunities for the project in future”
-               said Sam Tuke, GnuPG Campaign Manager.  “The release of GnuPG 2.1 and
-               the launch of a newly designed website later this year will bring
-               GnuPG and its clients for Windows, Mac, Gnu/Linux, and Android to new
-               audiences”.
-               </p>
-
-               <p>
-               Over the years GnuPG has kept up to date with new algorithms, such as
-               Elliptic Curve Cryptography, and reactive to new threats, such as key
-               extraction via acoustic monitoring, which was announced two days ago
-               by researchers as GnuPG updates were released, in coordination with
-               developers. Members remain confident of the future of GnuPG and look
-               forward to facing the privacy threats of tomorrow with community
-               support.
-               </p>
-
-
-               <p><a class="permalink"
-                       href="20131220-gnupg-turned-0x10.html"></a></p>
-
-               </div>
-
-
-               <div class="entry">
-               <a href="20131219-gnupg-launches-crowfunding.html"
-               ><h2>Press release: GnuPG encryption project launches crowdfunding
-               campaign</h2></a>
-               <h5>Posted 19th December 2013 by Sam Tuke</h5>
-
-
-               <p>Today GNU Privacy Guard (GnuPG) has launched its first
-               <a href="http://goteo.org/project/gnupg-new-website-and-infrastructure"
-               >crowdfunding campaign</a> with the aim of building a new
-               website and long term infrastructure. The 24.000 EUR target will
-               fund:</p>
-
-               <ul>
-               <li>Fresh web interfaces for gnupg.org including mobile</li>
-               <li>Completion and release of GnuPG 2.1</li>
-               <li>Anonymous Tor network access to the website</li>
-               <li>A new user friendly download page suitable for all devices</li>
-               <li>A new server for web services</li>
-               <li>New pages convening external guides, videos, and handbooks</li>
-               <li>Facilities for processing recurring donations for long
-               term project support</li>
-               </ul>
-
-               <p>Project founder and Lead Developer Werner Koch said “GnuPG has
-               seen a huge upsurge in popularity following recent state
-               spying revelations. After 16 years of continuous development,
-               we are now asking for community support to capitalise on
-               consumer demand for privacy, and make GnuPG easy to access for
-               mainstream audiences”.</p>
-
-               <p>GnuPG is one of the few tools remaining above suspicion in the
-               wake of leaked NSA documents. Edward Snowden and his contacts
-               including Bruce Schneier switched to GnuPG when they began handling
-               the secret
-               documents <a href="http://www.theguardian.com/world/2013/sep/05/nsa-how-to-remain-secure-surveillance">earlier
-               this year</a>. The Wall Street Journal, The Committee to Protect
-               Journalists,
-               and <a href="http://www.cjr.org/behind_the_news/hacks_hackers_security_for_jou.php">ProPublica</a>
-               have all embraced GnuPG for protection of staff and sources. Phil
-               Zimmermann, original inventor of Pretty Good Privacy (PGP), has also
-               moved to GnuPG in wake of the news.</p>
-
-               <p>“GnuPG is a key part of modern privacy infrastructure” said
-               Sam Tuke, Campaign Manager, GnuPG. “Millions of users rely on
-               GnuPG to work securely on servers, laptops and smartphones,
-               but 2013 donations totaling 3.000 EUR to date have not even
-               covered fixed costs. Supporting new algorithms like elliptical
-               curve and fixing newfound exploits fast takes a lot of work
-               which is done voluntarily. Now is the time for people to
-               contribute to making GnuPG slick and more sustainable in
-               future”.</p>
-
-               <p>Jacob Appelbaum, Tor Project developer, added “GnuPG is
-               important - it allows us the assurances we need to do our
-               work. Community funding is a critical part of a confident
-               outlook for GnuPG in future.”</p>
-
-
-               <p>For further information, please contact Sam Tuke.<br/>
-               Email: samtuke [at] gnupg.org<br/>
-               Phone: +49 176 81923811
-               </p>
-
-               <h4>About GNU Privacy Guard</h4>
-
-               <p>GnuPG is a leading cryptography app that protects emails and
-               data from interception. It is developed by a community of Free
-               Software engineers led by Werner Koch. GnuPG is used and
-               recommended by the world’s top security experts, including
-               Bruce Schneier and Phil Zimmermann. It offers best in class
-               privacy free of charge and restriction. Hundreds of companies
-               have integrated GnuPG into their products to perform mission
-               critical security, including Red Hat, Deutsche Bahn, and many
-               others.</p>
-
-               <p><a href="http://gnupg.org/">http://gnupg.org</a></p>
-
-               <p><a class="permalink"
-                       href="20131219-gnupg-launches-crowfunding.html"></a></p>
-               </div>
-
-
-
-               <div class="entry">
-               <a href="20131218-getting-goteo-approval.html"
-               ><h2>Getting Goteo approval</h2></a>
-               <h5>Posted 18th December 2013 by Sam Tuke</h5>
-
-               <div class="captioned-img right">
-               <img src="img/goteo-review.png"
-                       title="Project status on Goteo" />
-               <p>Pending project on Goteo</p>
-               </div>
-
-               <p>The targets are set, the rewards are prepared, the press release
-               has been edited and translated, and now we’re waiting for
-               approval from the crowdfunding
-               platform <a href="http://goteo.org/">Goteo</a>.</p>
-
-               <p>Goteo is like indiegogo, but more forward thinking. It has a
-               special focus on communal benefits and rewards - projects that
-               benefit society as a whole, not just project donors (though they
-               can get special rewards too).</p>
-
-
-               <p>Every ’good’ produced by a campaign on Goteo, be it artwork,
-               software, event, or manufactured product, has a license assigned
-               to it, like GPL or Creative Commons, and as well as asking for
-               money, projects ask for other forms of help called “non-economic
-               needs”, like translations or product
-               testing.  Goteo’s <a href="https://github.com/Goteo/Goteo">own
-               source</a> code is Free Software too, meaning anyone can run
-               their own Goteo crowdfunding server. That’s the feature that
-               swung our decision to use it for GnuPG.</p>
-
-
-                       <p>Because the type of project on Goteo is quite specific
-                       however, the acceptance phase of launching crowdfunding is
-                       taking us longer than expected. Right now we’re working with
-                       Goteo’s small team to answer questions which aren’t on the
-                       webforms you fill out when you design your project with their
-                       system.</p>
-
-                       <p>I’m hoping to provide what’s necesasry and get acceptance
-                       quickly. As soon as we have it the crowdfunding will launch
-                       and <a href="http://gnupg.hosted.phplist.com/lists/?p=subscribe&id=1"
-                       >newsletter</a> subscribers
-                       and <a href="https://twitter.com/gnupg">Twitter</a> followers
-                       will be the first to know.</p>
-
-               <p><a class="permalink"
-                       href="20131218-getting-goteo-approval.html"></a></p>
-
-
-               </div>
-
-
-
-
-               <div class="entry">
-               <a href="20131215-gcrypt-bench.html"
-               ><h2>Speedups in Libgcrypt 1.6</h2></a>
-               <h5>Posted 15 December 2013 by Werner Koch</h5>
-               <p>
-               [...]  To check how the forthcoming version 1.6.0 of Libgcrypt
-               compares to the older 1.5 version of Libgcrypt, I did some benchmarks
-               using a Thinkpad X220 which features an i5-2410M processor at 2.3GHz
-               running a 64 bit Debian Wheezy.
-               <a href="20131215-gcrypt-bench.html">{more}</a>
-               </p>
-               <p><a class="permalink" href="20131215-gcrypt-bench.html"></a></p>
-               </div>
-
-               <div class="entry">
-               <a href="20131213-preparing-for-launch.html"
-               ><h2 id="id-preparing-for-launch">Preparing for launch</h2></a>
-
-               <h5>Posted 13th December 2013 by Sam Tuke</h5>
-
-               <p>Mid December, giving season, and nearly time for the GnuPG
-               Crowdfunding to commence. We've been working hard on
-               preparations. Drafts of the new mobile website design have been  published and met positive feedback, and a community-contibuted
-               promo video was posted on YouTube. GnuPG coverage on Twitter
-               continues to grow with many articles
-               (<a href="http://www.theguardian.com/global-development-professionals-network/2013/nov/29/surveillance-online-campaigning-tips">The
-               Guardian</a>, <a href="http://usblog.kaspersky.com/gpg-strong-encryption-and-digital-signing-made-easy/">Kaspersky
-               Labs</a>, <a href="https://www.eff.org/deeplinks/2013/12/open-letter-urging-universities-encourage-conversation-about-online-privacy">The
-               EFF</a>, <a href="http://www.lifehacker.com.au/2013/11/the-best-projects-and-gear-to-set-up-your-secret-lair/">Lifehacker</a>,
-               ...) and 252 new followers in 6 weeks.</p>
-
-                <p>
-               Click <a href="https://www.youtube.com/watch?v=aEEckb-ioG4">here
-               </a> to view the video on YouTube. [embedded video
-               removed on 2014-04-28 due to privacy issues]</p>
-
-               <div class="captioned-img right" style="margin-top:0;">
-               <a href="img/mobile-front-page.png">
-               <img style="max-width:200px;" src="img/mobile-front-page.png"
-                       title="Mobile website design" />
-               </a>
-               <p>New mobile site draft</p>
-               </div>
-
-               <p>Last Friday I announced the crowdfunding to a crowded audience at
-               Berlin event
-               "<a href="http://www.boell.de/en/whatever-happened-privacy">Whatever
-               happened to privacy</a>", and Markus Beckedahl
-               (<a href="https://netzpolitik.org/">Netzpolitik<a>)
-               and <a href="https://en.wikipedia.org/wiki/Jacob_Appelbaum">Jacob
-               Appelbaum</a> (Tor Project and Wikileaks) amplified the importance
-               of supporting the project. Hugo Roy (FSFE) gave a talk on Wednesday
-               about the campaign at the Paris
-               '<a href="http://111213.net/">Hackadon</a>' - a new conference for
-               Free Software giving, organised by three
-               <a href="http://111213.net/#orga">crowdfunding
-               organisations</a>. His slides are online in the
-               GPG <a href="https://gitorious.org/gnupg/presentations">presentations
-               repository</a>.</p>
-
-               <p>Hopefully the crowdfunding page on Goteo (a Free Software
-               Kickstarter) will be ready for launch next week. Email me if you can
-               help with translating the press release - we're aiming for at least
-               three languages. And don't forget you can still sign up for email
-               updates (form below). Thanks for all your support so far!</p>
-
-                <p>[Subscribe code with references to external sites removed
-                    on 2014-04-28 due to privacy issues.]</p>
-
-
-               <p><a class="permalink" href="20131213-preparing-for-launch.html"></a></p>
-               </div>
-
-
-               <div class="entry">
-               <a href="20131113-friends-tell-friends-they-love-gnupg.html"
-               ><h2 id="id-friends-tell-friends-they-love-gnupg"
-                       >Friends tell friends they love GnuPG</h2></a>
-
-               <h5>Posted 13th November 2013 by Sam Tuke</h5>
-
-               <div class="captioned-img right">
-               <img src="img/android.jpg" title="GnuPG on Android" />
-               <p>GnuPG can run almost anywhere</p>
-               </div>
-
-               <p>Email encryption is one of those pleasures that can't be enjoyed
-               alone. Sending yourself messages secured with 4096-bit RSA is great
-               for proof of concept, but meaningful communication requires two
-               parties. GnuPG requires both those parties to have their own
-               keys.</p>
-
-               <p>Less than <abbr title="unscientific guess">1%</abbr> of all email
-               traffic is PGP encrypted, meaning that those of us who do make our
-               messages private routinely find ourselves in the frustrating
-               predicament of having to share our thoughts insecurely, even though
-               we know they're being intercepted, even though this is easily
-               avoidable, and even though we've already taken steps to do so. All
-               because our <strong>friends and colleagues</strong> don't know the
-               benefits of GnuPG.</p>
-
-               <p>Windows, Gnu/Linux, Mac, and Android all have point and click
-               GnuPG interfaces - at this point, all bases except iPhone are more
-               or less covered. That means the reason your contacts aren't OpenPGP
-               ready is <strong>not technical</strong>. And because GnuPG is Free
-               Software (and free of charge), it can't be about price.</p>
-
-               <p>A recommendation from you is the most effective way you can
-               increase the number of GnuPG users, and consequently increase the
-               percentage of the messages you send that are meaningfully
-               encrypted. That's why we're asking people in our community to think
-               of pithy explanations of why GnuPG is important and how it enables
-               them.</p>
-
-               <p>We've already got quotes from some big names like Bruce Schneier,
-               Jacob Appelbaum, and Richard Stallman. But the chances are
-               that <strong>your name</strong> carries more weight among your
-               peers. Please use it to share your appreciation for GnuPG!</p>
-
-               <p>If you use social networks, you can
-               use <a href="https://twitter.com/search?q=%23ilovegpg"
-               target="blank">#iloveGPG</a> to connect your messages to other
-               people's, and make is easier for us to find and repeat them.</p>
-
-               <p>Look out for weekly quotes posted from the
-               GnuPG <a target="blank" href="https://twitter.com/gnupg">Twitter</a>
-               and <a target="blank"
-               href="https://www.cryptospora.net/u/gnuprivacyguard">Diaspora</a>
-               accounts if you need inspiration. Let's fill up
-               the <a href="http://keys.gnupg.net/" target="blank">keyservers</a>
-               with fresh keys from new users!</p>
-
-               <p><a class="permalink"
-                       href="20131113-friends-tell-friends-they-love-gnupg.html"></a></p>
-               </div>
-
-               <div class="entry">
-               <a href="20131105-securing-the-future-of-gnupg.html"
-               ><h2 id="id-securing-the-future-of-gpg"
-                       >Securing the future of GPG</h2></a>
-               <h5>Posted 5th November 2013 by Sam Tuke</h5>
-
-               <p>If you've noticed some changes around here, there's a good reason
-               why. We have a plan for securing the long term stability of GnuPG
-               development by giving more to our users, and asking more from them
-               in return.</p>
-
-               <p>You already know that GnuPG is important, and as months of fresh
-               government spying revelations go by, it's becoming obvious that
-               GnuPG is one of the very few tools that can still be trusted to keep
-               our data safe from the overwhelming efforts of international law
-               enforcement. But developing GnuPG takes work - regular monitoring
-               for newfound threats and exploits, and new features to keep it sharp
-               with the latest encryption algorithms. We also need to reach out to
-               the millions of potential GnuPG users who are asking themselves how
-               they can make their email secure. Public-private key cryptography
-               hasn't yet gained mainstream acceptance, but it could if it were
-               just a little more appealing and accessible.</p>
-
-               <p>To maintain progress within the project we need to make it easier
-               for GnuPG users to support the work that we do. Ours is an app that
-               is often hidden from view, relied upon daily by hundreds of
-               thousands of people, often in life-threatening circumstances, yet
-               low profile and rarely supported by publicity or donations.</p>
-
-               <p>To change that we're going to launch a <strong>new
-               website</strong> with a fresh design, more friendly and accessible
-               information, and new resources to grow and strengthen our user
-               group. The new site will also allow the project to accept and manage
-               new forms of financial support, including automatic subscriptions to
-               sustain development long term.</p>
-
-               <p>Designing, building and populating the new site will take a few
-               months, and in order to cover the costs there will be
-               a <strong>crowd-funding</strong> campaign with a modest target, in
-               early December. We have some rewards up our sleeves for those who
-               donate.</p>
-
-               <p>When that time comes, <strong>we'll need your help</strong> -
-               telling your contacts, forwarding the announcement to your
-               communities, and contributing financially if you can.</p>
-
-               <p>You can subscribe to updates about the campaign using this
-               form. This is separate to other GnuPG mailing lists - update will be
-               sent here, and only here.</p>
-
-       <p>[Subscribe code with references to external sites removed
-       on 2014-04-28 due to privacy issues.]</p>
-
-               <p><a class="permalink"
-                       href="20131105-securing-the-future-of-gnupg.html"></a></p>
-               </div>
-
-               <div class="entry">
-               <a href="20131030-new-blog-first-post.html"
-               ><h2>New blog, first post</h2></a>
-               <h5>Posted 30th October 2013 by Sam Tuke</h5>
-
-               <p>Welcome to Gnu Privacy Guard's new blog! We're planning some
-               major changes to gnupg.org and how the project communicates in
-               general. I'm Sam, and I'll be writing updates here as our work
-               progresses. In future this blog will be replaced with a more
-               beautiful and featureful alternative, but bear with us as we get
-               from here to there.</p>
-
-               <p>For more timely updates you can follow our Twitter
-               accounts: <a
-               href="https://twitter.com/intent/follow?screen_name=GnuPrivacyGuard"
-               target="blank">@GnuPrivacyGuard</a>
-               and <a
-               href="https://twitter.com/intent/follow?screen_name=gnupg"
-               target="blank">@GnuPG</a>.
-               That's right, we have two! But I'm going to combine them shortly so
-               it's easier to keep track <strong>[UPDATE: accounts now merged!
-               Stick with @GnuPG]</strong>.</p>
-
-               <p>For more information, see
-               our <a href="http://gnupg.totemapp.com/company" target="blank">press
-               contact page</a> hosted on Totem. That's all for now.</p>
-
-               <p><a class="permalink" href="20131030-new-blog-first-post.html"></a></p>
-               </div>
-
-<!-- End Content -->
-
-</td>
-<td class="frame-right">&nbsp;</td>
-</tr>
-<tr>
-  <td class="frame-bottom">&nbsp;</td>
-  <td class="frame-corner">&nbsp;</td>
-</tr>
-<tr>
-  <td class="frame-spacing">&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</td>
-</tr>
-<tr>
-<td class="layout">&nbsp;</td>
-<td class="layout">
-<div class="frame-foot">
-       <table width="100%" summary="">
-               <col width="25%" /><col width="50%" /><col width="25%" />
-               <tr>
-       <td>&nbsp;</td>
-       <td>Technical resources for this<br />
-               service are sponsered by</td>
-       <td>&nbsp;</td>
-</tr>
-<tr>
-  <td>&nbsp;</td>
-  <td><a class="img" href="http://openit.de/">
-      <img src="logo-openit.png" alt="OpenIT" width="127"
-          height="40"/></a>
-  </td>
-  <td>&nbsp;</td>
-</tr>
-</table>
-<br />
-
-<p>
-  <a class="img" href="http://validator.w3.org/check/referer">
-    <img src="valid-xhtml10.png"
-        alt="Valid XHTML 1.0!"
-        height="31" width="88" /></a>
-  &nbsp;&nbsp;&nbsp;
-  <a class="img" href="http://www.drm.info/">
-    <img src="drm-info.png"
-        alt="Digital Respect for the Masses"
-        height="40" width="69" /></a>
-  &nbsp;&nbsp;&nbsp;
-  <a class="img" href="http://www.un.org/aboutun/charter/">
-    <img src="pace.png"
-        alt="Peace!"
-        height="40" width="58" /></a>
-  &nbsp;&nbsp;&nbsp;
-  <a class="img" href="http://jigsaw.w3.org/css-validator/validator?uri=http://www.gnupg.org/share/site.css">
-    <img src="vcss.gif"
-        alt="Valid CSS!"
-        height="31" width="88" /></a>
-</p>
-
-<p id="footer-legal">
-  <a href="privacy-policy.en.html">Privacy Policy</a>
-</p>
-
-</div>
-</td>
-</tr>
-</tbody>
-</table>
-
-</body>
-</html>
diff --git a/misc/blog.gnupg.org/index.org b/misc/blog.gnupg.org/index.org
new file mode 100644 (file)
index 0000000..08f3e53
--- /dev/null
@@ -0,0 +1,22 @@
+# Index of all blog entries
+#+STARTUP: showall
+
+#+HTML: <h1>The GnuPG blog</h1>
+
+#+HTML: <!--BEGIN-NEWEST-ENTRY-->
+#+HTML: <!--END-NEWEST-ENTRY-->
+
+* List of all blog entries
+  :PROPERTIES:
+  :CUSTOM_ID: blogindex
+  :END:
+
+#+HTML: <!--BEGIN-BLOG-INDEX-->
+#+HTML: <!--END-BLOG-INDEX-->
+
+* Comments
+
+  We do not provide a feature to comment on a blog.  Instead please
+  send remarks to the gnupg-users mailing list using the blog title
+  for the subject line.  This helps to keep the discussion at one
+  place and not to spread it over different media.
index b8396aa..795ebf2 100755 (executable)
@@ -7,7 +7,78 @@ if [ "$(pwd  | awk -F/ '{print $NF}')" != "blog.gnupg.org" ]; then
   exit 1
 fi
 
-rsync -vr --links --exclude '*~' --exclude upload \
+echo "upload: Rendering entries" >&2
+# We need to initialize that org cache to use our own publish function
+# despite that we do not use any org-publish feature
+emacs --batch \
+  --eval "(require 'assoc)" \
+  --eval "(require 'org)" \
+  --eval "(setq gpgweb-root-dir \"$(cd ../../web && pwd)/\")" \
+  --eval "(require 'gpgweb (concat gpgweb-root-dir \"share/gpgweb.el\"))" \
+  --eval "(setq org-publish-use-timestamps-flag nil)" \
+  --eval "(setq org-export-html-toplevel-hlevel 1)" \
+  --eval "(setq org-export-html-coding-system 'utf-8)" \
+  --eval "(gpgweb-setup-project)" \
+  --eval "(org-publish-initialize-cache \"gpgweb\")" \
+  --eval "(gpgweb-publish-blogs)"
+
+if [ ! -f index.html ]; then
+  echo "upload: index.html has not yet been build" >&2;
+  exit 1
+fi
+
+# Find all rendered HTML files but skip possible translated versions.
+find . -maxdepth 1 -type f -name "20*.html" -print \
+    | grep -v '\.[a-z][a-z].html$' | sort -r >index.tmp
+newest=$(head -1 index.tmp)
+
+# Extract the head lines
+: >index.headlines.tmp
+cat index.tmp | while read fname; do
+  echo -n "${fname#./}|" >>index.headlines.tmp
+  sed  -n '/^<h2 id=/ s,^<[^>]*>\(.*\)</h2>,\1,p' $fname >>index.headlines.tmp
+done
+
+# Update the index file
+echo "upload: Updating index.html" >&2
+awk -F:  <index.html  >index.tmp \
+    -v newest=${newest#./} '
+     /<!--BEGIN-NEWEST-ENTRY-->/ {indon=1; print; insertnewest() }
+     /<!--END-NEWEST-ENTRY-->/ {indon=0}
+     /<!--BEGIN-BLOG-INDEX-->/ {indon=1; print; insertindex() }
+     /<!--END-BLOG-INDEX-->/   {indon=0}
+     !indon { print }
+
+     function insertnewest () {
+       inblog = 0
+       while (getline < newest) {
+         if (match ($0, /^<main>/))  { inblog = 1; continue; }
+         if (match ($0, /^<\/main>/)) { inblog = 0; break; }
+         if (! inblog) { continue }
+         if (match ($0, /^<div id="content">/)) { continue; }
+         if (match ($0, /^<\/div><!-- end content -->/)) { continue; }
+         print $0
+       }
+      close(newest)
+     }
+
+     function insertindex (tag) {
+       file = "index.headlines.tmp";
+       print "<ul>"
+       while (getline < file) {
+         split($0, a, "|")
+         printf "  <li><a href=\"%s\">%s</a>\n", a[1], a[2];
+       }
+       print "</ul>"
+       close (file)
+     }
+     '
+mv index.tmp index.html || echo "upload: error updating index.html" >&2
+rm index.headlines.tmp
+
+echo "upload: Uploading files" >&2
+rsync -vr --links --exclude '*~' --exclude upload --exclude '*tmp' \
+   --exclude '*.org' \
    . werner@trithemius.gnupg.org:/var/www/www/www.gnupg.org/misc/blog/
 
 #eof
index 2091701..1e11a6a 100644 (file)
@@ -208,15 +208,63 @@ if not available."
 ")))
 
 
-(defun gpgweb-fixup-blog (info)
-  "Fix up a a blog entry."
-  (goto-char (point-min))
-  (if (re-search-forward "^<h2 id=.*\n" nil t)
-    (insert "<p class=\"postdate\">Posted "
-            (car (plist-get info :date))
-            " by "
-            (car (plist-get info :author))
-            "</p>\n")))
+(defun gpgweb-blog-index (orgfile filelist)
+  "Return the index of ORGFILE in FILELIST or nil if not found."
+  (let (found
+        (i 0))
+    (while (and filelist (not found))
+      (if (string= orgfile (car filelist))
+          (setq found i))
+      (setq i (1+ i))
+      (setq filelist (cdr filelist)))
+    found))
+
+(defun gpgweb-blog-prev (fileidx filelist)
+  "Return the chronological previous file at FILEIDX from FILELIST
+with the suffixed replaced by \"html\"."
+  (if (> fileidx 1)
+      (concat (file-name-sans-extension (nth (1- fileidx) filelist)) ".html")))
+
+(defun gpgweb-blog-next (orgfile filelist)
+  "Return the chronological next file at FILEIDX from FILELIST
+with the suffixed replaced by \"html\"."
+  (if (< fileidx (1- (length filelist)))
+      (concat (file-name-sans-extension (nth (1+ fileidx) filelist)) ".html")))
+
+(defun gpgweb-fixup-blog (info orgfile filelist)
+  "Insert the blog specific content.  INFO is the usual
+plist. ORGFILE is the name of the current source file without the
+directory part.  If FILELIST is a list it has an ordered list of
+org filenames."
+  (let ((authorstr (car (plist-get info :author)))
+        (datestr   (car (plist-get info :date))))
+    (goto-char (point-min))
+    (if (re-search-forward "^<main>" nil t)
+        (let* ((indexp (string= orgfile "index.org"))
+               (fileidx (if (listp filelist)
+                            (if indexp
+                                (1- (length filelist))
+                              (gpgweb-blog-index orgfile filelist))))
+               (prevfile (if fileidx
+                             (gpgweb-blog-prev fileidx filelist)))
+               (nextfile (if (and fileidx (not indexp))
+                           (gpgweb-blog-next fileidx filelist))))
+          (move-beginning-of-line nil)
+          (insert "<nav class=\"subnav\">\n  <ul>\n")
+          (if prevfile
+              (insert "    <li><a href=\"" prevfile "\">Previous</a></li>\n"))
+          (insert
+           "    <li><a href=\"/blog/index.html#blogindex\">Index</a></li>\n")
+          (if nextfile
+              (insert "    <li><a href=\"" nextfile "\">Next</a></li>\n"))
+          (insert "  </ul>\n</nav>\n")))
+    (if (and datestr authorstr)
+        (if (re-search-forward "^<h2 id=.*\n" nil t)
+            (insert "<p class=\"postdate\">Posted "
+                    datestr
+                    " by "
+                    authorstr
+                    "</p>\n")))))
 
 
 (defun gpgweb-insert-footer ()
@@ -256,6 +304,11 @@ if not available."
 ;;; - Insert header and footer
 ;;; - Insert "class=selected" into the active menu entry
 ;;; - Fixup sitemap.
+;;;
+;;; If blogmode is not nil the output is rendered as a blog.  BLOGMODE
+;;; may then contain an ordered list of org file names which are used
+;;; to create the previous and Next links for an entry.
+;;;
 (defun gpgweb-postprocess-html (plist orgfile htmlfile blogmode)
   (let* ((visitingp (find-buffer-visiting htmlfile))
         (work-buffer (or visitingp (find-file-noselect htmlfile)))
@@ -270,7 +323,9 @@ if not available."
                (gpgweb-insert-header title committed-at)
                (gpgweb-insert-menu fname-2)
                (if blogmode
-                   (gpgweb-fixup-blog plist))
+                   (gpgweb-fixup-blog plist
+                                      (file-name-nondirectory orgfile)
+                                      blogmode))
                (gpgweb-insert-footer)
 
                ; Fixup the sitemap
@@ -305,9 +360,10 @@ if not available."
 
 
 ;;;
-;;; The specialized publisher for the blog entries.
+;;; Turn the current buffer which has an org-mode blog entry into its
+;;; rendered form and save it with the suffix .html.
 ;;;
-(defun gpgweb-render-blob ()
+(defun gpgweb-render-blog (&optional filelist)
   (interactive)
   (let* ((extplist '(:language "en"
                      :section-numbers nil
@@ -316,7 +372,23 @@ if not available."
          (orgfile (buffer-file-name))
          (plist (org-export-get-environment 'gpgweb nil extplist))
          (htmlfile (org-gpgweb-export-to-html nil nil nil t extplist)))
-    (gpgweb-postprocess-html plist orgfile htmlfile t)))
+    (gpgweb-postprocess-html plist orgfile htmlfile (if filelist filelist t))))
+
+
+;;;
+;;; Publish all blog entries in the current directory
+;;;
+(defun gpgweb-publish-blogs ()
+  (interactive)
+  (let ((orgfiles (directory-files "." nil "^2[0-9]+-.*\.org$")))
+    (dolist (file (cons "index.org" orgfiles))
+      (let* ((visitingp (find-buffer-visiting file))
+             (work-buffer (or visitingp (find-file-noselect file))))
+        (with-current-buffer work-buffer
+          (gpgweb-render-blog orgfiles)
+          (basic-save-buffer))
+        (unless visitingp
+          (kill-buffer work-buffer))))))