diff --git a/simpleid/RoboFile.php b/simpleid/RoboFile.php
new file mode 100644
index 0000000..df63fab
--- /dev/null
+++ b/simpleid/RoboFile.php
@@ -0,0 +1,115 @@
+<?php
+
+use Gettext\Scanner\PhpScanner;
+use Gettext\Generator\PoGenerator;
+use Gettext\Translations;
+use Symfony\Component\Finder\Finder;
+
+/**
+ * This is project's console commands configuration for Robo task runner.
+ *
+ * @see http://robo.li/
+ */
+class RoboFile extends \Robo\Tasks {
+    public function xgettext() {
+        $domain = 'messages';
+
+        $finder = new Finder();
+        $finder->in('www')->name('*.php');
+
+        $translations[] = Translations::create($domain);
+
+        $scanner = new PhpScanner(...$translations);
+        $scanner->setDefaultDomain($domain);
+
+        $scanner->setFunctions(['t' => 'gettext']);
+
+        foreach ($finder as $file) {
+            $scanner->scanFile($file);
+        }
+
+        $generator = new PoGenerator();
+
+        foreach ($scanner->getTranslations() as $domain => $translations) {
+            $destFile = 'www/locale/messages.pot';
+
+            $translations->getHeaders()->set('Project-Id-Version', 'PACKAGE VERSION');
+            $translations->getHeaders()->set('Report-Msgid-Bugs-To', '');
+            $translations->getHeaders()->set('POT-Creation-Date', date('c'));
+            $translations->getHeaders()->set('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE');
+            $translations->getHeaders()->set('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>');
+            $translations->getHeaders()->set('Language-Team', 'LANGUAGE <LL@li.org>');
+            $translations->getHeaders()->set('MIME-Version', '1.0');
+            $translations->getHeaders()->set('Content-Type', 'text/plain; charset=UTF-8');
+            $translations->getHeaders()->set('Content-Transfer-Encoding', '8bit');
+
+            $generator->generateFile($translations, $destFile);
+        }
+    }
+
+    public function build() {
+        $ref = getenv('GITHUB_REF_NAME');
+        if ($ref === false) {
+            $version = 'master';
+        } else {
+            $version = str_replace('release-', '', $ref);
+        }
+
+        $dist_file = 'simpleid-' . $version . '.tar.gz';
+        
+        // 1. Set up robo collections and create temp directory
+        $main_collection = $this->collectionBuilder();
+        $prepare_collection = $this->collectionBuilder();
+        $temp = $main_collection->tmpDir();
+        $working = $main_collection->workDir("dist");
+
+        // 3. Prepare step
+        // (a) Copy files to temp directory
+        $prepare_collection->taskMirrorDir([
+            '.' => "$temp/simpleid"
+        ]);
+
+        // (b) remove unnecessary directories and files
+        $prepare_collection->taskDeleteDir([
+            "$temp/simpleid/.git",
+            "$temp/simpleid/.github",
+            "$temp/simpleid/.sourceforge",
+            "$temp/simpleid/dist",
+            "$temp/simpleid/vendor",
+            "$temp/simpleid/www/vendor",
+            "$temp/simpleid/www/test",
+            "$temp/simpleid/www/test-suite"
+        ]);
+
+        $prepare_collection->taskFileSystemStack()->remove([
+            "$temp/simpleid/www/.htaccess",
+            "$temp/simpleid/www/config.inc",
+            "$temp/simpleid/www/config.php",
+            "$temp/simpleid/www/composer.lock",
+            "$temp/simpleid/composer.lock"
+        ]);
+
+        // (c) run
+        $result = $prepare_collection->run();
+        if (!$result->wasSuccessful()) {
+            return $result;
+        }
+
+        // 4. Replace variables
+        $finder = new Finder();
+        $finder->in("$temp/simpleid/www")->name('*.php')->name('*.dist');
+        foreach($finder as $file) {
+            $main_collection->taskReplaceInFile($file)
+                ->from(['@@BUILD_VERSION@@', '@@IDENTITIES_DIR@@', '@@CACHE_DIR@@', '@@STORE_DIR@@'])
+                ->to([$version, '../identities', '../cache', '../store']);
+        }
+
+        // 5. Create the release files
+        $main_collection->taskFileSystemStack()->mkdir("$working/$version")->copy('.sourceforge/frs/README.md', "$working/$version/README.md");
+        $main_collection->taskPack("$working/$version/$dist_file")->addDir('simpleid/', "$temp/simpleid");
+        $main_collection->taskWriteToFile('version.txt')->line($version);
+
+        // 6. Run everything
+        return $main_collection->run();
+    }
+}
\ No newline at end of file
