How to work from a fork with an upstream repository

First, fork the upstream project on into your own domain. Then get the clone URL from your newly forked repo in your domain, and clone the repo to your local environment:

git clone

Then add the upstream repository as second remote:

git remote add upstream

Then switch to the upstream branch that you would like to eventually merge into:

git pull upstream develop
git checkout develop


git checkout --track upstream/develop
git pull

From that fresh, up-to-date branch you can now create your own “feature” branch:

git checkout -B mario-test

Now you can make your changes on the mario-test branch (in an editor). Then show a list of your changes:

git status
git diff

If you are happy, then add the changes to the “stage”:

git add .

Check again (stuff has now turned green = added to stage)

git status

Now you are ready to prepare a commit:

git commit -m "speaking short description of the changes, also links to the issue will work magically"

You can create several commits locally.

You can now push this commit or commits on your local feature branch to your remote forked repo:

git push origin

Now you can go to to your forked repo and create a Pull Request to a branch in your upstream repository, from your feature branch in your forked repo.

How to use one single gmail address for testing web applications by setting up several different accounts

At some point in any career invariably one will be ask to test or review a web application (or an app). Most of them require logging in as different users with different roles. On top, web applications normally require users to validate their email address. Testers / reviewers using different profiles traditionally needed to use different email accounts, for each new user they create in the application.

Managing multiple email accounts is a lot of overhead and becomes cumbersome and frustrating quickly.

What if I told you that there is an easy way to have different email addresses that lead all to the same inbox and that you can achieve that with ZERO click per additional email address? Read on.

It’s very simple. Sign up for a free email account with, Google’s email service. Let’s assume you just created a new email address as such:

Now about the “secret” part: Google delivers email to this inbox even if you change the email address slightly. After the username part of the email address (everything left to the @ sign) you can append a plus (+) and then you can use any combination of letters, numbers and minus (-) signs. For example or – It’s important to know that any email sent to an address such as will be delivered to your inbox!

That is very cool if you need to create different user accounts. Create just one gmail account and then sign up with the web application you would like to test using the trick above:


It’s important to consider that this little trick only works with addresses. That’s it! Have fun testing / reviewing your web applications! 👋

The top free (or cheap) ways to build your own website

Do you have a small business or just otherwise don’t have the budget to engage with a professional service provider or development team just yet? Then the following ways to get a decent website for free (or for cheap) might be for you.

A word of caution at the beginning: These website builders are quite rigid and simple. If you develop and grow your business you might soon find yourself in the situation where you’ll want to switch to a more powerful technology.


Squarespace is a cloud-based website builder. They support many different business types, for example they have templates for professional photographers but also for yoga studios.

Pricing starts at a couple of bucks per month. Of course, you can buy or connect a custom domain. Since it’s cloud-based you dont have to worry about hosting, it’s all included.

You can go here for a demo:


If for some reason you cannot warm up to Squarespace, you might want to try a good alternative:

Weebly is a bit cheaper, it comes at the monthly price of a cup of coffee (in Switzerland). It’s very similar to squarespace. They support your website building process by taking you through a step by step process which is a great help for absolute beginners.


If you tried Squarespace or Weebly and say: These don’t work for me I need more power and flexibility! Then you might want to try Webflow.

Webflow is NOT for beginners though. There are many, many settings and it can be confusing even for a professional. Webflow has pre-made templates that look good and are easy to adapt, but the advanced settings are still lurking in the shadows and there is nothing that protects you from messing things up.

At the same time Webflow falls short of giving a professional developer or designer the possibilities to implement a custom design perfectly.

Bespoke Website

The above options are too lightweight for you?

Do you have a budget and are you looking for professional web design and development? Then we at would be happy to help. Please get in touch via – we are looking forward to hearing from you.

django CMS for Editors

Intro & Documentation

Before you post questions please make sure that you’ve read through the django CMS resources first:

The django CMS Admin Interface – First Steps

  • Admin Panel: The admin panel is where all functionality is accessible, it’s your starting point. You can always go to the admin panel by appending /admin to your domain (i.e. or
  • Editing a page: You can go into Edit Mode on any page, by simply adding ?edit to any URL in the browser’s address bar. So if you are on then you can append ?edit to the URL ( and hit enter. You will then see a login screen unless you are already logged in and after that be able to double click on any part of the page to edit it directly.

Editor Best Practises

Setting up a Reverse Proxy for Divio vanity media domains

There is some official documentation available at – follow those steps.

You have to create a separate Divio project for the reverse proxy. You can fork or copy the below sample project and then add it to your Divio project as external repository:

You can get the Divio DSN for the S3 storage by logging into your website project via SSH and then execute echo $DEFAULT_STORAGE_DSN , then take that value to update the nginx configs in /nginx.

Then you can deploy the solution to see if it works. Don’t forget to set the DEFAULT_STORAGE_DSN env variable in the divio control for your main project.

deploy a production-ready React app on (HTTP to HTTPS Redirect on nginx)

The problem: Cloud hosting services such as terminate HTTPS already at the loadbalancer level. Your container that hosts react will never receive an incoming HTTPS connection. Still, upgrading HTTP connections to HTTPS connections falls in the responsibility of your container. How to fix that?

Special thanks to Jonathan for his advice and support.

Here is how to build and serve a React app with nginx on

Add an nginx/default.conf to your project:

## Redirect HTTP to HTTPS

server {
    # divio sends all traffic to port 80 as HTTPS is terminated already at the load balancer
    listen 80;

    client_max_body_size 20M;

    if ($http_x_forwarded_proto != 'https') {
        return 301 https://$host$request_uri;

    location / {
      alias /usr/share/nginx/html/;
      try_files $uri $uri/ /index.html =404;


change your Dockerfile accordingly:

FROM node:12.16.1 as builder

# for caching optimisations
COPY package*.json /
RUN npm install

COPY . /app

ENV PATH=/node_modules/.bin:$PATH

RUN npm run build

FROM nginx:latest
COPY --from=builder /app/build /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/default.conf /etc/nginx/conf.d

CMD ["nginx", "-g", "daemon off;"]

Update your docker-compose.yml for local support and testing (optional):

# This docker-compose.yml file is used to set up your project in the local
# development environment *only*. It is *not* used in deployment to our cloud
# servers, and has no effect whatsoever in cloud deployments.
# See our Developer Handbook for more information:
version: "2.3"

  # The web container is an instance of exactly the same Docker image as your
  # Cloud application container.
      context: .
      target: builder
    # Change the port if you'd like to expose your project locally on a
    # different port, for example if you already use port 8000 for
    # something else.
     - "8000:80"
      - ".:/app:rw"
    # There is currently a bug:
    tty: true
    # The default command that the container starts with. If you'd like to run
    # the project locally in Live configuration, you will need to change this.
    # See
    command: npm start

    build: .
    # Change the port if you'd like to expose your project locally on a
    # different port, for example if you already use port 8000 for
    # something else.
     - "8000:80"
      - "./nginx/default.conf:/etc/nginx/conf.d/default.conf"
    command: [nginx-debug, '-g', 'daemon off;']

Working with videos in Content Management Systems (CMS)

There are a few things to know when handling videos in Content Management Systems (CMS). Are you set to become a pro CMS editor? Then please read on:

Video Hosting

You might not be aware, but CMS are not a great place to host video. CMS run on web hosting, which is in most cases not suitable for hosting of large files. Also consider that the video file (for example an .mp4 video format) that you have locally on your desktop might not be optimized for the web.

On the other hand, video platforms such as youtube or vimeo have specialized in video hosting. Videos uploaded on video platforms are auto-magically compressed and optimized for the web, for the maximum compatibility! Doesn’t that sound like the right choice for hosting videos!

Good to know: Platforms such as youtube allow you to host videos for your website without showing them anywhere else, for example your youtube channel. This special mode is called an “unlisted” video.

Now how do we get Youtube play nicely together with your CMS? You have probably already seen that the video component in your CMS allows to insert a Youtube link. Let’s go get that link on youtube!

Step 1: Create an “unlisted” video on Youtube

Go to – if you don’t have a Google Account, maybe now is a good time to set up a shared gmail address for your department or team. Make sure you select the right channel or create a new one. Since it won’t be public anyway, you dont need to upload a logo or care about any optional fields. Then at some point you can upload your video:

Here you can just drag and drop your video
Set the visibility to “unlisted”
click on the link after the video has finished processing
copy the first part of the video url from the browser address bar (without &

Step 2: Edit the page in the CMS where you would like to add the video, add a video component

This is how it looks in django CMS:

simply paste the link from youtube into your CMS video component. In django CMS it’s called video player and the field is situated in the Embed video section.

Once you save, you can now see your video nicely embedded on your page!

Pro Tipp for Youtube

Did you notice the small video thumbnails that youtube puts at the end of your video to keep the user engaged? This is often not desirable. You can limit those previews to show only other (public) videos from your channel. In django CMS’ video component this behaviour can be configured with the Parameters field right below the video URL field. Just hit the + button and set a parameter rel to the value 0. In other systems you can try appending &rel=0 to the video URL. Try this example:

Working with images in Content Management Systems

There are a few things to know when handling images in Content Management Systems (CMS). Are you set to become a pro CMS editor? Then please read on:

Image size

We get it – you would like to have high quality images / photos everywhere on your website! We do, too! However bigger is not always better. It’s also important to optimize for page speed (see here why pagespeed matters). This means that the file size of our pictures should be as small as possible, while, of course, keeping the image quality on a satisfactory level.

Here is how!

Compress your Image

Some CMS compress images automatically when you upload it – but often the built-in image compression is not what it could be. On top of that, many CMS will keep the original image anyway “for the record”, using up unnecessary disk space.

It’s therefore recommendable to first upload your images to a tool such as – Here you can safely assume that your images are compressed to the max!

Just drag and drop your image(s) here!

Resize your image

Once you compressed your images, you can make your image even smaller by clicking the resize button right where you are!

After compressing, click the resize button

These days, images are best resized to either width or height at or below 4,000px (the most recent TV screens are called Ultra HD and have a 4K image resolution (3,840 x 2,160 pixels) and the most recent Macbook Air (3rd gen) has a screen resolution of  2,560 x 1,600 pixel.

If you know that your image won’t cover the full screen, you can resize it to something even smaller, for example max 500px (either width or height).

Enter a number for either height or width that is lower than the pre-filled value and press “Resize Images”

Image naming

Now you have a perfectly optimized image! Even though some CMS allow you to change the file name later on, the original file name will still be stored and will linger around! It is therefore recommended to give the image a speaking file name before you upload it to the CMS.

Good Example ✅: woman-in-green-dress-pointing-at-screen.jpg

  • Try to avoid spaces, use hyphens (the minus character) instead
  • try to describe what’s on the picture, not what you use the picture for (bad example: ❌ product-page-first-section.jpg)
  • put your image in a folder so it’s easier for you to find it later. Example folder name: Blog Post Header Images

Now you are ready to upload your picture into the CMS! 👏 Well done! 👍

By the way: Responsive Images

Some images are treated in a “smart” way by the CMS, meaning that the CMS adapts the width of the image according to the window width, and keeps the height of the image at an acceptable value according to the device or window width. Sounds like magic? It is!

Please read on about responsive images here:

Wichtige Punkte eines Website Relaunch Briefings

Welche Punkte mĂŒssen Teil eines Website Relaunch Briefings sein?

Konzeption, UX & Design

  • Branding, CI / CD: Branding Book, Style Guide, Webfonts, Ikonographie, etc. als Input fĂŒr Web Design
  • Fotografie: authentisches Fotomaterial, z.B. Portraits, Team-Bilder, etc.
  • Illustrationen: optional, ggf in Budget einplanen
  • Informations-Architektur (IA) & Inhalte: Welche Seiten, welche Hierarchien? Testimonials, Services, Produkte, Projekte, Team, Kontakt, Jobs, Blog, Landing Pages, etc.
  • Web Design: Gestaltung von einzelnen SchlĂŒssel-Seiten durch einen professionellen Web Designer in hoher Detailtreue in XD, Sketch oder figma, als pixel-genaue Vorlage fĂŒr die Umsetzung.


  • Content Migration: Content Management Ressourcen bereitstellen, bzw. im Budget einplanen.
  • Copywriting: Ressourcen bereitstellen fĂŒr das Copywriting falls nötig, bzw. im Budget einplanen.
  • Übersetzungen & Mehrsprachigkeit: Welche Sprachen sind relevant? FĂŒr Übersetzungen ggf Ressourcen bereitstellen oder in Budget einplanen

Online Marketing

  • Suchmaschinen-Sichtbarkeit: technisches SEO, Redirects setzen, Search Console und langfristige SEO-Strategie
  • Conversion Tracking & Analytics: Google Analytics migrieren, Google Tag Manager aufsetzen, Conversion Ziele (z.B. Whitepaper Download) festlegen und Tracking aufsetzen.
  • UX & Conversion Rate Optimierung: Geeignete Call-to-Actions setzen, Optimierung der User Experience (UX)
  • Performance: Page Speed Optimierung, Server Caching, Browser Caching Settings optimieren
  • Content Strategy: Relevante Themenwelten bestimmen
  • CRM Integration: Hubspot Formulare & Tracking aufsetzen.

Technologie & Operations

  • Content Management System & Technologie Stack: Gibt es CMS- oder sogar Technologie-PrĂ€ferenzen (z.B. python / django oder PHP)? Sind die Inhalts-Editoren bereits mit einem System vertraut? Sind Applikations-Logiken (z.B. ein Kundenportal) oder Integrationen mit anderen Systemen (z.B. SAP, ein DAM- oder PIM-System) geplant?
  • Device & browser KompatibilitĂ€t: KompatibilitĂ€ts-Matrix festlegen gemĂ€ss Google Analytics Auswertung: Welche Browser & GerĂ€te sind besonders relevant? IE11 KompatibilitĂ€t noch notwendig? Ggf im Budget entsprechend einplanen.
  • Hosting, Maintenance & Security: Sicherstellen performantes Hosting, Service Level Agreement inkl Backup und Maintenance Konditionen.

Rechtliche Aspekte

Privacy / GDPR: Muss den Usern die Möglichkeit zur vollen Datenschutz-Verwaltung gegeben werden gemÀss EU-Richtlinie? Oder reicht eine abgespeckte Schweizer Lösung, z.B. Marketing cookies / scripts nur aktiv nach Opt-in des Users und Google Analytics standardmÀssig aktiv mit Möglichkeit zum Opt-out.

floating labels for bootstrap 4 forms

based on

Bootstrap 4 form row:

<div class="row">
    <div class="col">
        <div class="form-group">
            <label class="has-float-label">
                <input class="form-control" name="email" type="text" placeholder="E-Mail" class="is-invalid">
            <p class="invalid-feedback d-block">
                This is a validation error message that needs to be inserted dynamically

SCSS mixin:

@import "~bootstrap/scss/functions/";
@import "~bootstrap/scss/mixins/";
@import "~bootstrap/scss/variables/";

@mixin has-float-label {
// taken from
display: block;
position: relative;

label, & > span {
background: white;
position: absolute;
cursor: text;
font-size: 75%;
opacity: 1;
-webkit-transition: all .2s;
transition: all .2s;
top: -.5em;
left: 0.75rem;
z-index: 3;
line-height: 1;
padding: 0 2px;

.form-control {

&::placeholder {
opacity: 0;
transition: all .2s;

&:placeholder-shown:not(:focus) + * {
font-size: 100%;
color: $input-placeholder-color;
transform: translateY(-50%);
top: 50%;