Custom Brick Wall Art: Unique Framed Brick Artwork for Homes and Offices

Most wall art is a print, a canvas, or a photograph. It’s flat, it’s reproducible, and the version on your wall is the same as the version on someone else’s. Custom brick wall art is none of those things. It’s three-dimensional, it’s tactile, and the piece hanging on your wall was designed specifically for you and exists nowhere else. If you want something on your wall that genuinely stops people in their tracks, this is a service worth knowing about.

What custom brick wall art is

Custom brick wall art is framed artwork built entirely from brick parts, set within a frame and designed to be displayed on a wall like any other piece of art. The difference is that the artwork itself is made from hundreds or thousands of individual parts rather than paint, ink, or photography. Portraits, patterns, landscapes, logos, abstract designs, and any other subject that translates well into the medium can be created this way, and the result is a piece that has genuine depth and texture that flat artwork simply can’t replicate.

The frame contains the build and gives the finished piece a clean, professional presentation. It’s designed to hang on a wall and stay there, a permanent piece rather than something that gets moved around or stored away.

What we can create

The range of subjects that work well in brick wall art is broader than most people expect. Portraits are a strong choice, whether that’s a person, a pet, or a character. Geometric and abstract patterns work particularly well because the regular geometry of brick parts lends itself naturally to that kind of design. Brand logos and typographic pieces are a strong option for offices and commercial spaces where you want something that represents the business but doesn’t look like standard corporate decoration. Landscapes, cityscapes, and iconic imagery can all be created depending on the scale and the level of detail the design calls for.

If you have an idea for something specific, get in touch and we’ll tell you honestly whether it translates well into this medium before you commit to anything. Not every subject works equally well at every scale, and we’d rather advise you on the right approach upfront than design something that doesn’t deliver what you had in mind.

For homes and for businesses

Custom brick wall art works in both residential and commercial settings, but the brief tends to look different depending on the context. For homes, the most popular commissions are portraits of people or pets, abstract pieces designed around a specific colour palette, or artwork connected to a personal interest or memory. For offices and commercial spaces, branded pieces, geometric designs in company colours, and statement artworks for reception areas and meeting rooms are the most common briefs.

For businesses in particular, a piece of custom brick wall art in a client-facing space does something that a standard piece of office decoration doesn’t. It’s a conversation starter, it’s visually distinctive, and it says something about the business that chose it. That combination of visual impact and brand relevance is difficult to achieve with anything off the shelf.

How the process works

The process follows the same structure as every other commission we take on. You brief us on the subject, the size, the colour palette, and where the piece will be displayed. We produce a digital render of the finished artwork for your review and work through any adjustments until you’re completely satisfied with the design. Once you’ve approved the render, we build the piece, frame it, and ship it to you.

Because wall art commissions are highly visual, the render stage is particularly important. You’ll see exactly what you’re getting before we commit to the build, and the adjustments you can make at that stage are significant. Getting the design right before production is the most important step in the process.

Pricing and delivery

Custom brick wall art pieces are priced individually based on the size of the piece, the complexity of the design, and the part count involved. Every commission is quoted before you commit to anything and there are no hidden costs. Shipping is included in your quote and we deliver worldwide.

Get in touch with your idea and we’ll come back with a quote and an honest assessment of what the finished piece will look like.

Frequently asked questions

What sizes are available?

Size is agreed as part of the brief rather than chosen from a fixed range. Larger pieces have more surface area for detail but also cost more to produce. We’ll advise on the right size for your subject and your space at the quoting stage.

Can I specify the colours?

Yes. Brick parts are available in a very wide range of colours and the palette for your piece is agreed as part of the design process. If you have specific colours in mind, or if you need the piece to match an existing interior or brand palette, include that in your brief.

How is the piece framed and hung?

The finished piece is set within a frame and ready to hang. We’ll provide guidance on the hanging requirements, including weight and fixing type, before the piece is shipped so you can prepare the wall in advance.

Is the artwork permanent or can it be dismantled?

The build is set within the frame as a permanent display piece rather than something designed to be taken apart. If you have specific requirements around this, mention them at the briefing stage and we’ll advise on what’s possible.

Do you ship internationally?

Yes, worldwide. Shipping is included in your quote upfront so there are no unexpected charges at the point of delivery.

Can a brick wall art piece be commissioned as a gift?

Yes. Like all our commissions, wall art pieces can be kept as a surprise and shipped directly to the recipient. Let us know at the enquiry stage and we’ll manage the process accordingly.

Commission your custom brick wall art piece

If you want something on your wall that nobody else has and that genuinely couldn’t have been made for anyone else, get in touch with your idea and we’ll take it from there. Every piece starts with a conversation and ends with something worth looking at every day.

Looking for a different type of custom build? Find out about our custom brick model kit service or browse all our services.

<div class="badge-base LI-profile-badge" data-locale="en_US" data-size="large" data-theme="dark" data-type="HORIZONTAL" data-vanity="ferdi-vol" data-version="v1"><a class="badge-base__link LI-simple-link" href="https://www.linkedin.com/in/%E2%9C%85-ferdi-vol-corporate-gifts/?trk=profile-badge"></a></div>
/* Auto generated, hash = 5dceu9kevqjdyuy2uw1atqrsu */
//TODO: Break this file down so that we can actually unit test it.
(function(window) {
  /**
  * Renders all unrendred LinkedIn Badges on the page
  */
  window.LIRenderAll = function () {
    var CALLBACK_NAME     = 'LIBadgeCallback', //Must match callback on helpers.js
        BADGE_NAMES       = '.LI-profile-badge, .LI-entity-badge',
        // TODO -- tracking param for other badge types
        TRACKING_PARAM    = 'profile-badge',
        responsesReceived = 0, //Keeps track of number of responses recieved for proper cleanup when finished
        expectedResponses = 0, //Keeps track of number of responses to expect
        scripts           = [ ], //Keeps track of scripts added for proper cleanup when finished
        childScripts      = {}, //Keeps track of child scripts to render
        badges            = Array.prototype.slice.call(document.querySelectorAll(BADGE_NAMES));

    var i, len, badge, rendered;
    for (i = 0, len = badges.length;  i < len; i++) {
      badge    = badges[i];
      rendered =  badge.getAttribute('data-rendered');
      if (!rendered) {
        expectedResponses++;
        badge.setAttribute('data-rendered', true);
        renderBadge(badge);
      }
    }

    function isCNDomain() {
      if (typeof window !== "undefined") {
        var hostName = window.location && window.location.hostname ||  '';
        return (/linkedin(-ei)?.cn$/).test(hostName);
      }

      return false;
    }

    function generateUrl(isEI) {
      var domainPrefix = isEI ? 'https://badges.linkedin-ei' : 'https://badges.linkedin';
      if (isCNDomain()) {
        return domainPrefix + ".cn/";
      }

      return domainPrefix + ".com/";
    }

    function getBadgeKeyQueryParams(badge) {
      return Array.prototype.slice.call(badge.attributes).filter(function (attr) {
        return attr.name.lastIndexOf('data-key-', 0) !== -1;
      }).map(function (attr) {
        // Most browsers automatically lowercase the attribute name when its being read
        // We are calling lowercase on it again to ensure consistency for any browsers that are lagging behind.
        return encodeURIComponent(attr.name.replace('data-', '').toLowerCase()) + '=' + encodeURIComponent(attr.value);
      });
    }

    /*
    * Renders a single badge on the page
    * @param badge: div element of badge to render
    */
    function renderBadge(badge) {
      var size       = badge.getAttribute('data-size'),
          locale     = badge.getAttribute('data-locale'),
          type       = badge.getAttribute('data-type'),
          theme      = badge.getAttribute('data-theme'),
          vanity     = badge.getAttribute('data-vanity'),
          version    = badge.getAttribute('data-version'),
          isEI       = badge.hasAttribute('data-ei'),
          entity     = badge.getAttribute('data-entity'),
          isCreatePage = badge.hasAttribute('data-iscreate'),
          uid        = Math.round(1000000 * Math.random()),
          baseUrl = generateUrl(isEI),
          queryParams = [
            'locale=' + encodeURIComponent(locale),
            'badgetype=' + encodeURIComponent(type),
            'badgetheme=' + encodeURIComponent(theme),
            'uid=' + encodeURIComponent(uid),
            'version=' + encodeURIComponent(version)
          ],
          url;

      if (version === 'v2') {
        baseUrl += 'view';
        queryParams.push('badgesize=' + encodeURIComponent(size));
        queryParams.push('entity=' + encodeURIComponent(entity));
        queryParams = queryParams.concat(getBadgeKeyQueryParams(badge));
      } else {
        baseUrl += 'profile';
        queryParams.push('maxsize=' + encodeURIComponent(size));
        queryParams.push('trk=' + encodeURIComponent(TRACKING_PARAM));
        queryParams.push('vanityname=' + encodeURIComponent(vanity));
      }

      if (isCreatePage) {
        queryParams.push('fromCreate=true');
      }

      url = baseUrl + '?' + queryParams.join('&');
      badge.setAttribute('data-uid' , uid);
      jsonp(url); //Calls responseHandler when done
    }

    /**
    * Handles a response from the server. Finds badge matching badgeUid and inserts badgeHtml there
    * @param badgeHtml: String representing contents of the badge
    * @param badgeUid: UID of the badge to target
    **/
    function responseHandler(badgeHtml, badgeUid) {
      responsesReceived ++;

      var i, badge, uid, isCreate;
      var defaultWidth = 330 // max possible width
      var defaultHeight = 300 // max possible height

      for (i = 0, len = badges.length; i < len; i++) {
        badge = badges[i];
        // isCreate needed to prevent reloading artdeco script tag
        isCreate = badge.getAttribute('data-iscreate');
        uid   = parseInt(badge.getAttribute('data-uid'), 10);
        if (uid === badgeUid) {
          var badgeMarkup = `<body>${badgeHtml}</body>`
          var iframe = document.createElement('iframe');
          iframe.onload = function() {
            var iframeBody = iframe.contentWindow.document.body;
            // 5 px buffer to avoid the badge border being cut off.
            iframe.setAttribute('height', (iframeBody.scrollHeight || defaultHeight) + 5);
            iframe.setAttribute('width', (iframeBody.scrollWidth || defaultWidth) + 5);
          };
          iframe.setAttribute('frameBorder', '0');
          iframe.style.display = 'block';
          badge.appendChild(iframe);
          iframe.contentWindow.document.open();
          iframe.contentWindow.document.write(badgeMarkup);
          iframe.contentWindow.document.close();
          replaceScriptTags(badge, isCreate);
        }
      }
      tryClean();
    }

  // These functions are needed because badge markup is added via innerHtml property which does not run script tags
  function replaceScriptTags(node, isCreate) {
    if (shouldReplaceNode(node, isCreate)) {
      node.parentNode.replaceChild(cloneScriptNode(node), node);
      childScripts[node.src] = true;
    } else {
      var i = 0,
          children = node.childNodes;
      while (i < children.length) {
        replaceScriptTags(children[i++], isCreate);
      }
    }
    return node;
  }

  function shouldReplaceNode(node, isCreate) {
    return isScriptNode(node) && !childScripts[node.src] && (!isCreate || (isCreate && !node.getAttribute('data-isartdeco')));
  }

  function isScriptNode(node) {
    return node.tagName === 'SCRIPT';
  }

  function cloneScriptNode(node){
    var script  = document.createElement("script");
    for( var i = node.attributes.length-1; i >= 0; i-- ) {
      script.setAttribute( node.attributes[i].name, node.attributes[i].value );
    }
    return script;
  }

    // Gets all incoming responses
    window[CALLBACK_NAME] = responseHandler;

    /**
    * Tries to clean added tags
    **/
    function tryClean() {
      //Clean up after all requests are done..
      //Accounts for people including script more than once
      var done = (responsesReceived >= expectedResponses && expectedResponses > 0) || responsesReceived >= badges.length;
      if (done) {
        delete window[CALLBACK_NAME];

        // remove all script tags
        scripts.map(function(script){
          document.body.removeChild(script);
        });

      }
    }

    /*
    * Makes Jsonp request, responses handles by CALLBACK_NAME
    * @param url String: url of server to make request to
    */
    function jsonp(url) {
      var script = document.createElement('script');
      script.src = url;
      scripts.push(script);
      document.body.appendChild(script);
    }
  };

  if (document.readyState === 'complete') {
    window.LIRenderAll();
  } else {
    window.addEventListener('load', window.LIRenderAll, false);
  }

})(window);
Popular Posts