💸 EthicalAds

EthicalAds lets publishers show ads to their target developer audience using ethical and privacy-focused data collection.

Developer Ad Network with privacy built in
EthicalAds is a an ad network for developers that takes privacy seriously. We use powerful content targeting to match ads with the right audience without any user tracking.

EthicalAds (code) provides a way for developers and other creators of technical content to get paid for content creation, without using privacy invading advertisement tooling.

EthicalAds is an alternative to traditional online advertising. Created by developers and for developers, EthicalAds curates ads from ethical companies that respect user privacy.

No tracking — developer-focused ads are curated based on site content, using machine powered learning. Say goodbye to ugly cookie banners.

Ready for more good news? The revenue share model is designed to be transparent and fair, and publishers receive the majority of ad revenue.

Also, the EthicalAds client allows publishers to customize the types of ads displayed on their sites. And it provides a dashboard to monitor ad performance and earnings.

The client supports text and image ad placements that are tasteful and non-invasive:

Running EthicalAds

EthicalAds is an invite-only network, but the server that it runs on is Open Source, readthedocs/ethical-ad-server:

GitHub - readthedocs/ethical-ad-server: The ethical ad server - ads for developers without all the tracking
The ethical ad server - ads for developers without all the tracking - GitHub - readthedocs/ethical-ad-server: The ethical ad server - ads for developers without all the tracking

As EthicalAds is made by ReadTheDocs, there is also great documentation available online:

Ethical Ad Server — Ethical Ad Server 1.14.0 documentation

Unfortunately the docs aren't super docker friendly, but there is a docker-compose.yml file that we can learn from:

# Docker Compose Local Development Setup
#
# This starts a local multi-container development environment
# with Postgres, Redis, Celery, and Django.
# The configuration comes from .envs/local
#
# To run:
#   $ make dockerbuild
#   $ make dockerserve

version: '3'

volumes:
  local_postgres_data: {}
  local_postgres_data_backups: {}
  local_metabase_data: {}

services:
  django: &django
    build:
      context: .
      dockerfile: ./docker-compose/django/Dockerfile
    image: ethicaladserver_local_django
    depends_on:
      - postgres
    volumes:
      - .:/app
    env_file:
      - ./.envs/local/django
      - ./.envs/local/postgres
    ports:
      - "${ETHICALADS_DJANGO_PORT:-5000}:5000"
    command: /start
    # Allow us to run `docker attach` and get
    # control on STDIN and be able to debug our code with interactive pdb
    stdin_open: true
    tty: true

  postgres:
    build:
      context: .
      dockerfile: ./docker-compose/postgres/Dockerfile
    image: ethicaladserver_production_postgres
    volumes:
      - local_postgres_data:/var/lib/postgresql/data
      - local_postgres_data_backups:/backups
    env_file:
      - ./.envs/local/postgres

  redis:
    image: redis:5.0

  celeryworker:
    <<: *django
    image: ethicaladserver_local_celeryworker
    depends_on:
      - redis
      - postgres

    env_file:
      - ./.envs/local/django
      - ./.envs/local/postgres

    ports: []
    command: /start-celeryworker

  celerybeat:
    <<: *django
    image: ethicaladserver_local_celerybeat
    depends_on:
      - redis
      - postgres

    env_file:
      - ./.envs/local/postgres
      - ./.envs/local/django

    ports: []
    command: /start-celerybeat

  frontend:
    build:
      context: .
      dockerfile: ./docker-compose/frontend/Dockerfile
    ports: []
    volumes:
      - .:/app

Since there are no published images, you'd need to build the image from the Dockerfiles in the repository, but the setup is a pretty standard Django application, so Pythonistas should feel right at home.