How to install Craft CMS on Debian 12
To Install Craft CMS On Debian 12
Introduction:
Craft CMS is a popular content management system (CMS) that allows users to create and manage websites and digital experiences which is known for its flexibility, powerful features, and user-friendly interface. Craft CMS is developed by Pixel & Tonic, a software development company.
Installation Steps:
Step 1: Check the OS version by using the below command.
root@linuxhelp:~# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Step 2 : Update the system packages by using the below command.
root@linuxhelp:~# apt update -y
Hit:1 http://security.debian.org/debian-security bookworm-security InRelease
Hit:2 http://deb.debian.org/debian bookworm InRelease
Hit:3 http://deb.debian.org/debian bookworm-updates InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
131 packages can be upgraded. Run 'apt list --upgradable' to see them.
Step 3 : Create a user by using the below command.
root@linuxhelp:~# /usr/sbin/adduser craftcms
Adding user `craftcms' ...
Adding new group `craftcms' (1003) ...
Adding new user `craftcms' (1003) with group `craftcms (1003)' ...
Creating home directory `/home/craftcms' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for craftcms
Enter the new value, or press ENTER for the default
Full Name []: craftcms
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
Adding new user `craftcms' to supplemental / extra groups `users' ...
Adding user `craftcms' to group `users' ...
Step 4: Make the sudo privileges to the user by using the below command.
root@linuxhelp:~# /usr/sbin/usermod -aG sudo craftcms
Step 5: Login the user by using the below command.
root@linuxhelp:~# su - craftcms
Step 6: Install the Nginx by using the below command.
craftcms@linuxhelp:~$ sudo apt install nginx
[sudo] password for craftcms:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
libc-ares2 libgrpc++1.51 libgrpc29 libprotoc32 libre2-9
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
nginx-common
Suggested packages:
fcgiwrap nginx-doc
The following NEW packages will be installed:
nginx nginx-common
0 upgraded, 2 newly installed, 0 to remove and 131 not upgraded.
Need to get 640 kB of archives.
After this operation, 1,696 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://deb.debian.org/debian bookworm/main amd64 nginx-common all 1.22.1-9 [112 kB]
Get:2 http://deb.debian.org/debian bookworm/main amd64 nginx amd64 1.22.1-9 [527 kB]
Fetched 640 kB in 0s (1,815 kB/s)
Preconfiguring packages ...
Selecting previously unselected package nginx-common.
(Reading database ... 196520 files and directories currently installed.)
Preparing to unpack .../nginx-common_1.22.1-9_all.deb ...
Unpacking nginx-common (1.22.1-9) ...
Selecting previously unselected package nginx.
Preparing to unpack .../nginx_1.22.1-9_amd64.deb ...
Unpacking nginx (1.22.1-9) ...
Setting up nginx-common (1.22.1-9) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.
Setting up nginx (1.22.1-9) ...
Upgrading binary: nginx.
Processing triggers for man-db (2.11.2-2) ...
Step 7: Start the Nginx by using the below command.
craftcms@linuxhelp:~$ sudo systemctl start nginx
[sudo] password for craftcms:
Step 8: Enable the Nginx by using the below command.
craftcms@linuxhelp:~$ sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
Step 9: Check the Status of Nginx by using the below command.
craftcms@linuxhelp:~$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Wed 2024-05-08 12:50:06 IST; 1h 0min ago
Docs: man:nginx(8)
Main PID: 4445 (nginx)
Tasks: 5 (limit: 3408)
Memory: 3.7M
CPU: 111ms
CGroup: /system.slice/nginx.service
├─4445 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─4447 "nginx: worker process"
├─4448 "nginx: worker process"
├─4449 "nginx: worker process"
└─4450 "nginx: worker process"
May 08 12:50:06 linuxhelp systemd[1]: Starting nginx.service - A high performance web server and a reverse proxy server...
May 08 12:50:06 linuxhelp systemd[1]: Started nginx.service - A high performance web server and a reverse proxy server.
Step 10: Install the PHP and PHP extensions by using the below command.
craftcms@linuxhelp:~$ sudo apt install php php-cli php-common php-json php-gmp php-fpm php-xmlrpc php-bcmath php-imagick php-curl php-zip php-gd php-mysql php-xml php-mbstring php-xmlrpc php-intl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
libc-ares2 libgrpc++1.51 libgrpc29 libprotoc32 libre2-9
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
libapache2-mod-php8.2 libxmlrpc-epi0 libzip4 php8.2 php8.2-bcmath php8.2-cli php8.2-common php8.2-curl php8.2-fpm php8.2-gd php8.2-gmp php8.2-imagick php8.2-intl php8.2-mbstring php8.2-mysql
php8.2-opcache php8.2-readline php8.2-xml php8.2-xmlrpc php8.2-zip
Suggested packages:
php-pear
The following NEW packages will be installed:
libapache2-mod-php8.2 libxmlrpc-epi0 libzip4 php php-bcmath php-cli php-common php-curl php-fpm php-gd php-gmp php-imagick php-intl php-json php-mbstring php-mysql php-xml php-xmlrpc php-zip
php8.2 php8.2-bcmath php8.2-cli php8.2-common php8.2-curl php8.2-fpm php8.2-gd php8.2-gmp php8.2-imagick php8.2-intl php8.2-mbstring php8.2-mysql php8.2-opcache php8.2-readline php8.2-xml
php8.2-xmlrpc php8.2-zip
0 upgraded, 36 newly installed, 0 to remove and 131 not upgraded.
Need to get 7,438 kB of archives.
After this operation, 31.3 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://deb.debian.org/debian bookworm/main amd64 php-common all 2:93 [13.1 kB]
Get:2 http://security.debian.org/debian-security bookworm-security/main amd64 php8.2-common amd64 8.2.18-1~deb12u1 [678 kB]
Get:3 http://deb.debian.org/debian bookworm/main amd64 php8.2-imagick amd64 3.7.0-4 [98.4 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 php-imagick amd64 3.7.0-4 [6,476 B]
Get:5 http://deb.debian.org/debian bookworm/main amd64 libxmlrpc-epi0 amd64 0.54.2-1.3+b1 [34.8 kB]
Get:6 http://deb.debian.org/debian bookworm/main amd64 php8.2-xmlrpc amd64 3:1.0.0~rc3-6 [15.4 kB]
Setting up php-xmlrpc (3:1.0.0~rc3-6) ...
Setting up php-gmp (2:8.2+93) ...
Setting up php-fpm (2:8.2+93) ...
Setting up php-cli (2:8.2+93) ...
update-alternatives: using /usr/bin/php.default to provide /usr/bin/php (php) in auto mode
update-alternatives: using /usr/bin/phar.default to provide /usr/bin/phar (phar) in auto mode
update-alternatives: using /usr/bin/phar.phar.default to provide /usr/bin/phar.phar (phar.phar) in auto mode
Setting up php-zip (2:8.2+93) ...
Setting up php-imagick (3.7.0-4) ...
Setting up php (2:8.2+93) ...
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u3) ...
Processing triggers for php8.2-cli (8.2.18-1~deb12u1) ...
Processing triggers for php8.2-fpm (8.2.18-1~deb12u1) ...
NOTICE: Not enabling PHP 8.2 FPM by default.
NOTICE: To enable PHP 8.2 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php8.2-fpm
NOTICE: You are seeing this message because you have apache2 package installed.
Processing triggers for libapache2-mod-php8.2 (8.2.18-1~deb12u1) ...
Step 11 : Check the PHP version by using the below command.
craftcms@linuxhelp:~$ php -v
PHP 8.2.18 (cli) (built: Apr 11 2024 22:07:45) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.18, Copyright (c) Zend Technologies
with Zend OPcache v8.2.18, Copyright (c), by Zend Technologies
Step 12 : Edit the php.ini file by using the below command.
craftcms@linuxhelp:~$ sudo vim /etc/php/8.2/fpm/php.ini
max_execution_time = 300
memory_limit = 512M
post_max_size = 128M
upload_max_filesize = 128M
Step 13 : Restart the php-fpm by using the below command.
craftcms@linuxhelp:~$ sudo systemctl restart php8.2-fpm
Step 14 : Download and install the composer by using the below command.
craftcms@linuxhelp:~$ sudo curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...
Composer (version 2.7.6) successfully installed to: /home/craftcms/composer.phar
Use it: php composer.phar
Step 15 : Move the Composer file to the users binary location by using the below command.
craftcms@linuxhelp:~$ sudo mv composer.phar /usr/local/bin/composer
Step 16 : Check the Composer version by using the below command.
craftcms@linuxhelp:~$ composer --version
Composer version 2.7.6 2024-05-04 23:03:15
PHP version 8.2.18 (/usr/bin/php8.2)
Run the "diagnose" command to get more detailed diagnostics output.
Step 17 : Install the MariaDB server and client by using the below command.
craftcms@linuxhelp:~$ sudo apt install mariadb-server mariadb-client
[sudo] password for craftcms:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
libc-ares2 libgrpc++1.51 libgrpc29 libprotoc32 libre2-9
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
libmariadb3 mariadb-backup mariadb-client-core mariadb-common mariadb-plugin-connect mariadb-plugin-cracklib-password-check mariadb-plugin-gssapi-client mariadb-plugin-gssapi-server
mariadb-plugin-hashicorp-key-management mariadb-plugin-mroonga mariadb-plugin-oqgraph mariadb-plugin-provider-bzip2 mariadb-plugin-provider-lz4 mariadb-plugin-provider-lzma
mariadb-plugin-provider-lzo mariadb-plugin-provider-snappy mariadb-plugin-rocksdb mariadb-plugin-s3 mariadb-plugin-spider mariadb-server-10.5 mariadb-server-core mariadb-test mariadb-test-data
Suggested packages:
mailx netcat-openbsd
The following packages will be upgraded:
libmariadb3 mariadb-backup mariadb-client mariadb-client-core mariadb-common mariadb-plugin-connect mariadb-plugin-cracklib-password-check mariadb-plugin-gssapi-client
mariadb-plugin-gssapi-server mariadb-plugin-hashicorp-key-management mariadb-plugin-mroonga mariadb-plugin-oqgraph mariadb-plugin-provider-bzip2 mariadb-plugin-provider-lz4
mariadb-plugin-provider-lzma mariadb-plugin-provider-lzo mariadb-plugin-provider-snappy mariadb-plugin-rocksdb mariadb-plugin-s3 mariadb-plugin-spider mariadb-server mariadb-server-10.5
mariadb-server-core mariadb-test mariadb-test-data
25 upgraded, 0 newly installed, 0 to remove and 106 not upgraded.
Need to get 0 B/58.3 MB of archives.
After this operation, 1,118 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Reading changelogs... Done
Preconfiguring packages ...
Setting up mariadb-test-data (1:10.11.6-0+deb12u1) ...
Setting up libmariadb3:amd64 (1:10.11.6-0+deb12u1) ...
Setting up mariadb-server-core (1:10.11.6-0+deb12u1) ...
Setting up mariadb-client-core (1:10.11.6-0+deb12u1) ...
Setting up mariadb-backup (1:10.11.6-0+deb12u1) ...
Setting up mariadb-client (1:10.11.6-0+deb12u1) ...
Setting up mariadb-server (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-cracklib-password-check (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-provider-bzip2 (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-provider-lzma (1:10.11.6-0+deb12u1) ...
Setting up mariadb-test (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-mroonga (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-oqgraph (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-hashicorp-key-management (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-gssapi-client (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-connect (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-rocksdb (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-provider-lzo (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-gssapi-server (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-provider-lz4 (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-provider-snappy (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-s3 (1:10.11.6-0+deb12u1) ...
Setting up mariadb-plugin-spider (1:10.11.6-0+deb12u1) ...
Setting up mariadb-server-10.5 (1:10.11.6-0+deb12u1) ...
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u3) ...
Step 18 : Check Status of MariaDB by using the below command.
craftcms@linuxhelp:~$ sudo systemctl status mariadb
● mariadb.service - MariaDB 10.11.6 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; preset: enabled)
Active: active (running) since Wed 2024-05-08 13:57:03 IST; 1min 3s ago
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Process: 20618 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Process: 20619 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 20621 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_P>
Process: 20766 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 20768 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
Main PID: 20698 (mariadbd)
Status: "Taking your SQL requests now..."
Tasks: 39 (limit: 3408)
Memory: 238.6M
CPU: 1.558s
CGroup: /system.slice/mariadb.service
└─20698 /usr/sbin/mariadbd
May 08 13:57:03 linuxhelp mariadbd[20698]: 2024-05-08 13:57:03 0 [Note] Server socket created on IP: '127.0.0.1'.
May 08 13:57:03 linuxhelp mariadbd[20698]: 2024-05-08 13:57:03 0 [Note] /usr/sbin/mariadbd: ready for connections.
May 08 13:57:03 linuxhelp mariadbd[20698]: Version: '10.11.6-MariaDB-0+deb12u1' socket: '/run/mysqld/mysqld.sock' port: 3306 Debian 12
May 08 13:57:03 linuxhelp systemd[1]: Started mariadb.service - MariaDB 10.11.6 database server.
May 08 13:57:03 linuxhelp /etc/mysql/debian-start[20781]: Checking for insecure root accounts.
Step 19 : Login to the MySQL by using the below command.
craftcms@linuxhelp:~$ sudo mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 60
Server version: 10.11.6-MariaDB-0+deb12u1 Debian 12
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Step 20 : Create Database by using the below command.
MariaDB [(none)]> CREATE DATABASE craftcms;
Query OK, 1 row affected (0.001 sec)
Step 21 : Create User by using the below command.
MariaDB [(none)]> CREATE USER 'craft'@'localhost' IDENTIFIED BY 'Craft@123';
Query OK, 0 rows affected (0.043 sec)
Step 22 : Make Grant Privileges to the user by using the below command.
MariaDB [(none)]> GRANT ALL PRIVILEGES ON craftcms.* TO 'craft'@'localhost' IDENTIFIED BY 'Craft@123';
Query OK, 0 rows affected (0.007 sec)
Step 23 : Refresh the changes by using the below command.
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)
Step 24 : Exit from MySQL by using the below command.
MariaDB [(none)]> EXIT
Bye
Step 25 : Create the DocumentRoot Directory by using the below command.
craftcms@linuxhelp:~$ sudo mkdir /var/www/craftcms
Step 26 : Change the Ownership for Document Root by using the below command.
craftcms@linuxhelp:~$ sudo chown -R craftcms:craftcms /var/www/craftcms
Step 27 : Go to the Location by using the below command.
craftcms@linuxhelp:~$ cd /var/www/craftcms
Step 28 : Download and Setup Latest version of Craft CMS with required details by using the below command.
craftcms@linuxhelp:/var/www/craftcms$ composer create-project craftcms/craft .
Creating a "craftcms/craft" project at "./"
Installing craftcms/craft (5.0.1)
- Downloading craftcms/craft (5.0.1)
- Installing craftcms/craft (5.0.1): Extracting archive
Created project in /var/www/craftcms/.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 108 installs, 0 updates, 0 removals
- Locking bacon/bacon-qr-code (2.0.8)
- Locking brick/math (0.12.1)
- Locking cebe/markdown (1.2.1)
- Locking commerceguys/addressing (v2.2.0)
- Locking composer/semver (3.4.0)
34 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files
61 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
> @php -r "file_exists('.env') || copy('.env.example.dev', '.env');"
> @php -r "unlink('composer.json');"
> @php -r "rename('composer.json.default', 'composer.json');"
Generating optimized autoload files
Generated optimized autoload files containing 5444 classes
> @php craft setup/welcome
______ .______ ___ _______ .___________.
/ || _ \ / \ | ____|| |
| ,----'| |_) | / ^ \ | |__ `---| |----`
| | | / / /_\ \ | __| | |
| `----.| |\ \----./ _____ \ | | | |
\______|| _| `._____/__/ \__\ |__| |__|
A N E W I N S T A L L
______ .___ ___. _______.
/ || \/ | / |
| ,----'| \ / | | (----`
| | | |\/| | \ \
| `----.| | | | .----) |
\______||__| |__| |_______/
Generating an application ID ... done (CraftCMS--fccac351-720a-4d5f-ad45-1c5a3698a6bf)
Generating a security key ... done (3FGM4NzPy8i9Z2U9N65faYCxzD4_vvvh)
Welcome to Craft CMS!
Are you ready to begin the setup? (yes|no) [no]:yes
Are you ready to begin the setup? (yes|no) [no]:yes
Which database driver are you using? (mysql or pgsql) [mysql]
Database server name or IP address: [127.0.0.1]
Database port: [3306]
Database username: [root] craft
Database password:
Database name: craftcms
Database table prefix:
Testing database credentials ... success!
Saving database credentials to your .env file ... done
Install Craft now? (yes|no) [yes]:
Username: [admin] admin
Email: admin@linuxhelp1.com
Password:
Confirm:
Site name: linuxhelp1.com
Site URL: http://linuxhelp1.com
Site language: [en-US]
*** installing Craft
> create table {{%addresses}} ... done (time: 0.024s)
> create table {{%announcements}} ... done (time: 0.007s)
> create table {{%assetindexdata}} ... done (time: 0.004s)
> add foreign key fk_zygtxdoohkullpbtjtrgdcvpjusyxvaazynu: {{%userpermissions_users}} (userId) references {{%users}} (id) ... done (time: 0.015s)
> add foreign key fk_uhrnobdqtpddqxdjlmfprekpxobqifiocxwr: {{%userpreferences}} (userId) references {{%users}} (id) ... done (time: 0.011s)
> add foreign key fk_jwyllnysfakkqebusrosnlqjfargbdkfzgbc: {{%users}} (id) references {{%elements}} (id) ... done (time: 0.024s)
> add foreign key fk_nsxazsbgbnbovknfsjvfuaiiadmuehvopnby: {{%users}} (photoId) references {{%assets}} (id) ... done (time: 0.033s)
> add foreign key fk_nsvmbzkvjvbxxornxqdbahwyahzwbvqkjcbz: {{%volumefolders}} (parentId) references {{%volumefolders}} (id) ... done (time: 0.019s)
> add foreign key fk_dmgfoyxayynpgdhqxubseektsiapwmktchkh: {{%volumefolders}} (volumeId) references {{%volumes}} (id) ... done (time: 0.022s)
> add foreign key fk_xrrzbdhpzsqfkbpxbsseknwabyyggeyuurzg: {{%volumes}} (fieldLayoutId) references {{%fieldlayouts}} (id) ... done (time: 0.019s)
> add foreign key fk_hngdbofkysddansluhktswdpttvolxqsmjrq: {{%webauthn}} (userId) references {{%users}} (id) ... done (time: 0.011s)
> add foreign key fk_ewjxunaduhpvyhxcqugjsdosqmmuwulqqyzr: {{%widgets}} (userId) references {{%users}} (id) ... done (time: 0.476s)
> populating the info table ... done
> saving default site data ... done
> saving the first user ... done
*** installed Craft successfully (time: 4.600s)
Generating project config files from the loaded project config ... done
Step 29 : Change the Ownership for Document Root by using the below command.
craftcms@linuxhelp:/var/www/craftcms$ sudo chown -R www-data:www-data /var/www/craftcms
[sudo] password for craftcms:
Step 30 : Create a New virtual host with required domains by using the below command.
craftcms@linuxhelp:/var/www/craftcms$ sudo vim /etc/nginx/conf.d/craftcms.conf
Step 31 : Restart the Nginx by using the below command.
craftcms@linuxhelp:/var/www/craftcms$ sudo systemctl restart nginx
Step 32 : Make the Host entry by using the below command.
craftcms@linuxhelp:/var/www/craftcms$ sudo vim /etc/hosts
Step 33 : Go to the Browser and Search the Domain as shown in below image.
Conclusion:
We have reached the end of this article. In this guide, we have walked you through the steps required to install Craft CMS on Debian 12. Your feedback is much welcome.