DuckDuckGo Community Platform
JavaScript Perl CSS PLpgSQL HTML Perl 6 Other
Switch branches/tags
Latest commit 1dbcc1b Nov 10, 2017
Failed to load latest commit information.
bin Set some userpage dev server behaviour from environment May 12, 2016
docs SHOW MUST GO ON!!!!! Oct 27, 2013
lib Merge pull request #1501 from duckduckgo/john/post-to-asana Nov 7, 2017
root Updated file formatting Nov 10, 2017
script Additional checks of uploaded file before s3cmd mv May 31, 2017
share More blog link fixes Mar 15, 2017
sql Subscriber columns to track bounced / feedback loop statuses Jan 19, 2017
src Commit Page - send developer account URL to the backend Aug 23, 2016
t Updating tests for multi-campaign verify and overlaps Feb 16, 2017
templates update footer to match DDG Sidebar Sep 18, 2017
views Update newsletter form in /blog Apr 20, 2017
xbin replace $self by $ddgc, add newline May 22, 2014
.gitignore Merge branch 'john/activity-feed' into dev-community Aug 18, 2015
.travis.yml Merge branch 'master' into dev-ddh May 12, 2016
Changes A bit code reorganization, adding base DuckPAN functionality Jan 18, 2012
Gruntfile.js Gruntfile.js - update test-ia script path Apr 27, 2016
LICENSE Fix https May 24, 2016
PULL_REQUEST_TEMPLATE "Heading"-ify section headings Apr 20, 2016
README.markdown Add/replace licenses URLs with a more 'permanent' URL. Apr 29, 2016
bower.json Add casperjs and phantomjs to dependencies Apr 18, 2016
cpanfile Fix cpanfile Jan 20, 2017
ddgc_web.psgi Added Debug Middleware Sep 7, 2011
dist.ini Remove duckpan upload Aug 29, 2017
package.json Release IA pages version: 0.210.0 Sep 7, 2016
weaver.ini Ok... PodWeaver can be useful... Apr 25, 2013


DuckDuckGo - Community Platform

This is the source code for the DuckDuckGo Community Platform at

Requirements / Installation

The DuckDuckGo Community Platform is built on Perl, Catalyst, DBIx::Class, Text::Xslate and Dancer2.

Requires perl 5.16.3 (or higher) and:

  • cpanm (local::lib and/or perlbrew recommended)
  • gcc toolchain (gcc, make, lib headers)
  • git
  • libcurl
  • imagemagick
  • postgresql (recommended, though you may get away with mysql or sqlite for now)

To install these on Debian / Ubuntu:

  apt-get install cpanm build-essential libgd2-xpm-dev libssl-dev git libcurl4-gnutls-dev libxml2-dev imagemagick perl-doc postgresql libpq-dev

To proceed with installation, you will also need Dist::Zilla

  cpanm -i Dist::Zilla

To install community-platform's Perl dependencies, go to its directory and run:

  dzil authordeps --missing | cpanm
  dzil listdeps --missing | grep -v abstract | cpanm

This will take some time. You can add --notest to the cpanm command to speed things up, but this may result in fires later.

Test Data

Before running the dev server, we need a database schema.

The default is to use SQLite if no DSN configuration environment variables are found, e.g.

  export DDGC_DB_DSN='dbi:Pg:database=ddgc';
  export DDGC_DB_USER='ddgc';
  export DDGC_DB_PASSWORD='yourdbpass';

To run the dev environment deployment script, your postgres user requires the following permissions:


This script deploys the schema and populates it with a test / dev data set:


You can also roll over any existing schema with the --kill switch:

  script/ --kill

For the flags to work, you need to generate their sprites. This process has to be repeated everytime the country flags are changed.


Community platform's generated static files, media uploads, caches, duckpan packages etc. live in $HOME/ddgc/


To launch the development web server:


This, by default, launches a plack server bound to port 5001 with DBIC and Catalyst console debugging enabled with Plack debug panels in rendered output.

It watches the lib/ directory and restarts if there are any changes written. It supports the following options:

  • -p - Set port to bind to
  • -m - Use a debug mailer on localhost:1025 (python -m smtpd -n -c DebuggingServer localhost:1025)
  • -n - Don't render Plack debug panels (useful for frontend work)

Front end elements (js, css...) in src/ are managed by node.js / grunt.

To launch a task to rebuild static files when they change, use

grunt watch

User Accounts

The following accounts are created by

  • testone An admin, who is native German but also speaks English.

  • testtwo A normal user who speaks Spanish with public profile.

  • testthree A translation manager who speaks English, Arabic, and German.

  • testfour An admin, who speaks German, Spanish, and English.

  • testfive A normal user without public profile, who speaks Russian and English.

  • Additionally there are also test1 to test40 all without any setup.

Any random password will suffice, as a separate service is used to provide authentication in production.


This software is licensed under Perl 5 dual license: either GPLv1 or later, or, at users' choice, Artistic 1.0. We welcome contributions to this software under the same licensing terms.

Third party credits

The project is built using other software packages and creative content: