SlideShare a Scribd company logo
1 of 32
Download to read offline
Stop making, 
start composing! 
Using Composer for Drupal development
About me 
• CTO and partner at Reload! A/S 
• Ding.Core team member 
• Maintainer of wsdl2phpgenerator 
• Interested in developer workflows 
automation and code quality. 
• kasper@reload.dk / @kasperg
• Drupal development agency 
• 15 people 
• Office in Frederiksberg 
• Specialists in agile development, 
complex solutions, integrations 
and consultancy 
• Clients include Danish Radio, IDA, 
Samvirke, STOFA, TV2 and others
What is wrong about Drush Make? 
• Making is slow 
• Making is frail 
• Drush Make is not intended for rebuilding
Get off the island […] get 
involved in the wider PHP 
community, both to learn 
from it and to share with it. 
– Larry Garfield, Drupal Core contribuor, 31 December 2012 
! 
! 
!
What is right about Drush Make 
• Overview of used 
projects 
• Supports patching 
• Support for non-Drupal 
code 
projects[feedback_simple][subdir] = contrib 
projects[feedback_simple][version] = 1.6 
! 
projects[feeds][subdir] = contrib 
projects[feeds][version] = 2.0-alpha7 
; Support the use of summary on body fields. Summary here 
; is the built-in teaser in Drupal. 
projects[feeds][patch][962912] = http://drupal.org/files/ 
node-summary-mapper-962912-11.patch 
! 
libraries[chosen][download][type] = git 
libraries[chosen][download][url] = https://github.com/ 
harvesthq/chosen.git 
libraries[chosen][download][revision] = v0.9.9
5 minute Composer 
crash course
What is Composer? 
Composer is a project dependency manager, 
not a package manager. 
! 
Inspired by Ruby Bundler and Node.JS npm 
! 
Cross-platform compatible (Windows, Linux, and OSX) 
Requires >= PHP 5.3.2 and 
optionally Subversion, GIT, and/or Mercurial 
! 
Released in 2011 under the MIT license 
Developed by: Nils Adermann and Jordi Boggiano
What does Composer do? 
• Manages dependent 
libraries 
• Handles cascading 
dependencies 
• Declarative dependency 
• Install and update 
dependencies 
• Autoload dependencies 
{ 
"name": "kasperg/composer-demo", 
"description": "A demo Composer project", 
"require": { 
"silex/silex": "1.1.*" 
}, 
"authors": [ 
{ 
"name": "Kasper Garnaes", 
"email": "kasper@reload.dk" 
} 
] 
}
Live demo
Packagist 
• Over 40.000 packages 
• Default package repository for 
Composer 
• Contains nearly every widely used 
open source PHP package 
• Free accounts to register and 
maintain own packages
Composer vs. Drush Make 
• Manages dependent 
libraries 
• Handles cascading 
dependencies 
• Declarative dependency 
# composer.json 
{ 
"require": { 
"silex/silex": "1.1.*" 
}, 
} 
! 
! 
! 
# drush.make 
api = 2 
core = 7.x 
projects[ctools][version] = 1.4
By Carsten ten Brink, https://flic.kr/p/fX4XWL 
Time to jump through 
some hoops
Lets get started!
Drupal Core 
• Located in the root directory of the 
project 
• Use Composer custom installers 
• Example: Composer non-destructive 
archive installer 
• https://github.com/azt3k/non-destructive- 
archive-installer
Modules and themes I 
• Composer repository for Drupal 
projects 
• Developed by Will Milton 
Lead technology architect, Promet 
Source 
• http://static.drupal-packagist.org/ 
v0.2.0/ 
• Source: https://github.com/ 
winmillwill/drupal-parse-composer
Modules and themes II 
• Package naming: 
drupal/[project-name] 
• Version naming: 
[drupal-major-version]. 
[project-major-version]. 
[project-minor-version] 
• http://static.drupal-packagist.org/ 
v0.2.0/ 
• Source: https://github.com/ 
winmillwill/drupal-parse-composer
Modules and themes III 
• Move projects to the appropriate 
location using Composer Installers 
• http://composer.github.io/installers/ 
• Supports individual projects and 
types including drupal-module, 
drupal-theme, drupal-profile, 
drupal-drush
Patches 
• Composer does not support 
patching projects. It promotes a 
fork/pullrequest-based workflow. 
• Use Composer Patches Plugin 
• Developed for TYPO3 
• https://github.com/netresearch/ 
composer-patches-plugin
Libraries 
• Packagist packages can be added 
through requires 
• Includes PHP but also JS, CSS! 
• Packages without composer support 
can be defined manually through 
composer.json 
• Same approach applies for 
sandboxes
Wrap up 
• Composer can support the same use 
cases as Drush Make in the 
development process and more 
through community work. 
• Enables tapping into and sharing 
with the PHP community at large. 
By Richard Paterson, https://flic.kr/p/6wnBHM
Project template 
• Use a project template to get 
started and avoid repeating 
boilerplate configuration 
• php composer.phar create-project 
reload/drupal-composer-project 
some-dir --stability dev —no-interaction 
• https://github.com/reload/drupal-composer- 
project
Whats next?
Drupal composer repository 
• drupal.org must provide an 
authoritative Composer repository 
for Drupal packages. 
• Could replace updates.drupal.org 
over time. 
• Until then: Continued work on 
static.drupal-packagist.org.
! 
The Future of Drush 
• Relevant as ever 
• Reduced scope 
• make and dl no longer 
needed
What about Drupal 8? 
• Already has a composer.json file 
in the project root. 
• Better directory structure makes 
things a lot easier. 
• Drupal 8 core directory subslit can be 
used as a Composer package 
• https://github.com/tstoeckler/ 
drupal-core
Suomisvej 2, 2. sal 
1927 Frederiksberg 
reload.dk 
kontakt@reload.dk 
!
ALWAYS LOOKING FOR TALENTED DEVELOPERS 
! 
! 
https://github.com/reload/job-application 
job@reload.dk 
!

More Related Content

What's hot

August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
Howard Greenberg
 

What's hot (20)

Drupal 8 and Pantheon
Drupal 8 and PantheonDrupal 8 and Pantheon
Drupal 8 and Pantheon
 
Untangling fall2017 week1
Untangling fall2017 week1Untangling fall2017 week1
Untangling fall2017 week1
 
Phase2 Large Drupal Multisites (gta case study)
Phase2   Large Drupal Multisites (gta case study)Phase2   Large Drupal Multisites (gta case study)
Phase2 Large Drupal Multisites (gta case study)
 
Introduction to Drupal 7 - Getting Drupal up and running
Introduction to Drupal 7 - Getting Drupal up and runningIntroduction to Drupal 7 - Getting Drupal up and running
Introduction to Drupal 7 - Getting Drupal up and running
 
OpNovember Water Cooler Talk: The Mystery of Domino on Docker - Part 1
OpNovember Water Cooler Talk: The Mystery of Domino on Docker - Part 1OpNovember Water Cooler Talk: The Mystery of Domino on Docker - Part 1
OpNovember Water Cooler Talk: The Mystery of Domino on Docker - Part 1
 
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
 
Zend Expressive in 15 Minutes
Zend Expressive in 15 MinutesZend Expressive in 15 Minutes
Zend Expressive in 15 Minutes
 
How to Successfully Build a Local (Docker) Community
How to Successfully Build a Local (Docker) CommunityHow to Successfully Build a Local (Docker) Community
How to Successfully Build a Local (Docker) Community
 
How to contribute for Docker Labs
How to contribute for Docker LabsHow to contribute for Docker Labs
How to contribute for Docker Labs
 
Drupal in-depth
Drupal in-depthDrupal in-depth
Drupal in-depth
 
Staying on Topic - Invoke OpenFaaS functions with Kafka
Staying on Topic - Invoke OpenFaaS functions with KafkaStaying on Topic - Invoke OpenFaaS functions with Kafka
Staying on Topic - Invoke OpenFaaS functions with Kafka
 
August OpenNTF Webinar - Git and GitHub Explained
August OpenNTF Webinar - Git and GitHub ExplainedAugust OpenNTF Webinar - Git and GitHub Explained
August OpenNTF Webinar - Git and GitHub Explained
 
Drupal in 5
Drupal in 5Drupal in 5
Drupal in 5
 
[HKDUG] #20151017 - BarCamp 2015 - Drupal 8 is Coming! Are You Ready?
[HKDUG] #20151017 - BarCamp 2015 - Drupal 8 is Coming! Are You Ready?[HKDUG] #20151017 - BarCamp 2015 - Drupal 8 is Coming! Are You Ready?
[HKDUG] #20151017 - BarCamp 2015 - Drupal 8 is Coming! Are You Ready?
 
The Self-Service Developer - GOTOCon CPH
The Self-Service Developer - GOTOCon CPHThe Self-Service Developer - GOTOCon CPH
The Self-Service Developer - GOTOCon CPH
 
February OpenNTF Webinar: Introduction to Ansible for Newbies
February OpenNTF Webinar: Introduction to Ansible for NewbiesFebruary OpenNTF Webinar: Introduction to Ansible for Newbies
February OpenNTF Webinar: Introduction to Ansible for Newbies
 
Content-Centric Web Development with Apache Sling
Content-Centric Web Development with Apache SlingContent-Centric Web Development with Apache Sling
Content-Centric Web Development with Apache Sling
 
[GID Live] Open-Source Cloud-Native Programming Language
[GID Live] Open-Source Cloud-Native Programming Language[GID Live] Open-Source Cloud-Native Programming Language
[GID Live] Open-Source Cloud-Native Programming Language
 
WCM-9 WCM Solutions with Drupal and Alfresco
WCM-9 WCM Solutions with Drupal and AlfrescoWCM-9 WCM Solutions with Drupal and Alfresco
WCM-9 WCM Solutions with Drupal and Alfresco
 
DocOps: Documentation at the Speed of Agile
DocOps: Documentation at the Speed of AgileDocOps: Documentation at the Speed of Agile
DocOps: Documentation at the Speed of Agile
 

Similar to Stop making, start composing - Using Composer for Drupal development

LuisRodriguezLocalDevEnvironmentsDrupalOpenDays
LuisRodriguezLocalDevEnvironmentsDrupalOpenDaysLuisRodriguezLocalDevEnvironmentsDrupalOpenDays
LuisRodriguezLocalDevEnvironmentsDrupalOpenDays
Luis Rodríguez Castromil
 
Freelancer Weapons of mass productivity
Freelancer Weapons of mass productivityFreelancer Weapons of mass productivity
Freelancer Weapons of mass productivity
Gregg Coppen
 

Similar to Stop making, start composing - Using Composer for Drupal development (20)

Habitat Workshop at Velocity London 2017
Habitat Workshop at Velocity London 2017Habitat Workshop at Velocity London 2017
Habitat Workshop at Velocity London 2017
 
Why to docker
Why to dockerWhy to docker
Why to docker
 
R meetup 20161011v2
R meetup 20161011v2R meetup 20161011v2
R meetup 20161011v2
 
Composer JSON kills make files
Composer JSON kills make filesComposer JSON kills make files
Composer JSON kills make files
 
Scaling Your App With Docker Swarm using Terraform, Packer on Openstack
Scaling Your App With Docker Swarm using Terraform, Packer on OpenstackScaling Your App With Docker Swarm using Terraform, Packer on Openstack
Scaling Your App With Docker Swarm using Terraform, Packer on Openstack
 
Code the docs-yu liu
Code the docs-yu liuCode the docs-yu liu
Code the docs-yu liu
 
habitat at docker bud
habitat at docker budhabitat at docker bud
habitat at docker bud
 
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
Leonid Vasilyev  "Building, deploying and running production code at Dropbox"Leonid Vasilyev  "Building, deploying and running production code at Dropbox"
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
 
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
 
Containers and Microservices for Realists
Containers and Microservices for RealistsContainers and Microservices for Realists
Containers and Microservices for Realists
 
Containers and microservices for realists
Containers and microservices for realistsContainers and microservices for realists
Containers and microservices for realists
 
Neev Open Source Contributions
Neev Open Source ContributionsNeev Open Source Contributions
Neev Open Source Contributions
 
Docker based-pipelines
Docker based-pipelinesDocker based-pipelines
Docker based-pipelines
 
Learn from my Mistakes - Building Better Solutions in SPFx
Learn from my  Mistakes - Building Better Solutions in SPFxLearn from my  Mistakes - Building Better Solutions in SPFx
Learn from my Mistakes - Building Better Solutions in SPFx
 
LuisRodriguezLocalDevEnvironmentsDrupalOpenDays
LuisRodriguezLocalDevEnvironmentsDrupalOpenDaysLuisRodriguezLocalDevEnvironmentsDrupalOpenDays
LuisRodriguezLocalDevEnvironmentsDrupalOpenDays
 
Efficient development workflows with composer
Efficient development workflows with composerEfficient development workflows with composer
Efficient development workflows with composer
 
Ruby in office time reboot
Ruby in office time rebootRuby in office time reboot
Ruby in office time reboot
 
Dockerize All The Things
Dockerize All The ThingsDockerize All The Things
Dockerize All The Things
 
Docker based-Pipelines with Codefresh
Docker based-Pipelines with CodefreshDocker based-Pipelines with Codefresh
Docker based-Pipelines with Codefresh
 
Freelancer Weapons of mass productivity
Freelancer Weapons of mass productivityFreelancer Weapons of mass productivity
Freelancer Weapons of mass productivity
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 

Stop making, start composing - Using Composer for Drupal development

  • 1. Stop making, start composing! Using Composer for Drupal development
  • 2. About me • CTO and partner at Reload! A/S • Ding.Core team member • Maintainer of wsdl2phpgenerator • Interested in developer workflows automation and code quality. • kasper@reload.dk / @kasperg
  • 3. • Drupal development agency • 15 people • Office in Frederiksberg • Specialists in agile development, complex solutions, integrations and consultancy • Clients include Danish Radio, IDA, Samvirke, STOFA, TV2 and others
  • 4.
  • 5. What is wrong about Drush Make? • Making is slow • Making is frail • Drush Make is not intended for rebuilding
  • 6.
  • 7. Get off the island […] get involved in the wider PHP community, both to learn from it and to share with it. – Larry Garfield, Drupal Core contribuor, 31 December 2012 ! ! !
  • 8. What is right about Drush Make • Overview of used projects • Supports patching • Support for non-Drupal code projects[feedback_simple][subdir] = contrib projects[feedback_simple][version] = 1.6 ! projects[feeds][subdir] = contrib projects[feeds][version] = 2.0-alpha7 ; Support the use of summary on body fields. Summary here ; is the built-in teaser in Drupal. projects[feeds][patch][962912] = http://drupal.org/files/ node-summary-mapper-962912-11.patch ! libraries[chosen][download][type] = git libraries[chosen][download][url] = https://github.com/ harvesthq/chosen.git libraries[chosen][download][revision] = v0.9.9
  • 9.
  • 10. 5 minute Composer crash course
  • 11. What is Composer? Composer is a project dependency manager, not a package manager. ! Inspired by Ruby Bundler and Node.JS npm ! Cross-platform compatible (Windows, Linux, and OSX) Requires >= PHP 5.3.2 and optionally Subversion, GIT, and/or Mercurial ! Released in 2011 under the MIT license Developed by: Nils Adermann and Jordi Boggiano
  • 12. What does Composer do? • Manages dependent libraries • Handles cascading dependencies • Declarative dependency • Install and update dependencies • Autoload dependencies { "name": "kasperg/composer-demo", "description": "A demo Composer project", "require": { "silex/silex": "1.1.*" }, "authors": [ { "name": "Kasper Garnaes", "email": "kasper@reload.dk" } ] }
  • 14. Packagist • Over 40.000 packages • Default package repository for Composer • Contains nearly every widely used open source PHP package • Free accounts to register and maintain own packages
  • 15. Composer vs. Drush Make • Manages dependent libraries • Handles cascading dependencies • Declarative dependency # composer.json { "require": { "silex/silex": "1.1.*" }, } ! ! ! # drush.make api = 2 core = 7.x projects[ctools][version] = 1.4
  • 16. By Carsten ten Brink, https://flic.kr/p/fX4XWL Time to jump through some hoops
  • 17.
  • 19. Drupal Core • Located in the root directory of the project • Use Composer custom installers • Example: Composer non-destructive archive installer • https://github.com/azt3k/non-destructive- archive-installer
  • 20. Modules and themes I • Composer repository for Drupal projects • Developed by Will Milton Lead technology architect, Promet Source • http://static.drupal-packagist.org/ v0.2.0/ • Source: https://github.com/ winmillwill/drupal-parse-composer
  • 21. Modules and themes II • Package naming: drupal/[project-name] • Version naming: [drupal-major-version]. [project-major-version]. [project-minor-version] • http://static.drupal-packagist.org/ v0.2.0/ • Source: https://github.com/ winmillwill/drupal-parse-composer
  • 22. Modules and themes III • Move projects to the appropriate location using Composer Installers • http://composer.github.io/installers/ • Supports individual projects and types including drupal-module, drupal-theme, drupal-profile, drupal-drush
  • 23. Patches • Composer does not support patching projects. It promotes a fork/pullrequest-based workflow. • Use Composer Patches Plugin • Developed for TYPO3 • https://github.com/netresearch/ composer-patches-plugin
  • 24. Libraries • Packagist packages can be added through requires • Includes PHP but also JS, CSS! • Packages without composer support can be defined manually through composer.json • Same approach applies for sandboxes
  • 25. Wrap up • Composer can support the same use cases as Drush Make in the development process and more through community work. • Enables tapping into and sharing with the PHP community at large. By Richard Paterson, https://flic.kr/p/6wnBHM
  • 26. Project template • Use a project template to get started and avoid repeating boilerplate configuration • php composer.phar create-project reload/drupal-composer-project some-dir --stability dev —no-interaction • https://github.com/reload/drupal-composer- project
  • 28. Drupal composer repository • drupal.org must provide an authoritative Composer repository for Drupal packages. • Could replace updates.drupal.org over time. • Until then: Continued work on static.drupal-packagist.org.
  • 29. ! The Future of Drush • Relevant as ever • Reduced scope • make and dl no longer needed
  • 30. What about Drupal 8? • Already has a composer.json file in the project root. • Better directory structure makes things a lot easier. • Drupal 8 core directory subslit can be used as a Composer package • https://github.com/tstoeckler/ drupal-core
  • 31. Suomisvej 2, 2. sal 1927 Frederiksberg reload.dk kontakt@reload.dk !
  • 32. ALWAYS LOOKING FOR TALENTED DEVELOPERS ! ! https://github.com/reload/job-application job@reload.dk !