Custom Brick Model Pet Portraits: Turn Your Pet into a Brick Model

Your pet is one of a kind. A custom brick model pet portrait captures them in a way that a photo on your phone never quite can. Built from your reference images and designed specifically around your animal, it’s a piece that sits on a shelf, starts conversations, and lasts indefinitely. Whether you want it as a gift, a personal keepsake, or a way to remember a pet you’ve lost, the result is the same: something genuinely unique that couldn’t have been made for anyone else.

What animals we work with

Dogs and cats are the most common subjects, but we work with any animal that can be captured well in brick form. Reptiles, birds, rabbits, horses, and other pets are all subjects we can design from good reference material. The key is having clear photos of your animal from multiple angles so the design accurately captures their specific features, colouring, and character rather than producing a generic version of the breed.

If you’re not sure whether your pet would make a good subject for a brick portrait, get in touch with a photo and we’ll tell you honestly what’s possible before you commit to anything.

Who orders a pet portrait brick model

Most pet portrait commissions fall into one of three situations. The first is as a gift for someone who loves their pet more than most things in their life and is genuinely difficult to buy for. A brick portrait of their dog or cat is a gift that tells them you put real thought into it, and it’s not something they’d ever have bought themselves. The second is as a personal keepsake, something to have made simply because you love your pet and want something that represents them in a way a photograph doesn’t. The third, and the one that carries the most weight, is as a memorial piece for an animal that’s been lost.

Losing a pet is really hard, and a brick portrait made in their memory is a way of keeping something of them that feels permanent and considered rather than disposable. These commissions are handled with the care they deserve and we take particular care to get the likeness right when the model is being made in remembrance.

How the design process works

Everything starts with your reference photos. The more angles you can provide, ideally front, side, and three quarter views, the more accurately we can capture your pet’s specific features in the design but we can always work with what you have so don’t worry if you don’t have all of these angles.

For colouring and markings, close-up photos of distinctive patches, spots, or facial features are particularly helpful. You don’t need professional photographs, clear photos taken in good light on a phone are good enough.

Once we have your reference material and have confirmed the brief, we design the model digitally and produce renders for your review. You’ll see the portrait from multiple angles and can request adjustments before we move into production. We don’t source a single part until you’re completely happy with how the model looks. Once you’ve approved the design, we source the parts, pack the set with building instructions, and ship it to you wherever you are in the world.

Memorial pet portraits

If you’re commissioning a brick portrait in memory of a pet you’ve lost, please let us know when you get in touch. We handle memorial commissions with particular care throughout the process, from the reference material you share with us through to the design stage and delivery. The model we produce is meant to be something you’re genuinely glad you have, and getting the likeness and the character of your animal right matters more on a memorial commission than on any other.

If you only have a limited number of photos, or if the photos you have are older, we’ll work with what you have and ask the right questions to fill in any gaps. We’d rather take a little longer and get it right than rush a commission that means this much.

Pricing and delivery

Pet portrait brick models start from £120 / $150 for smaller desk-sized pieces. The final price depends on the size of the model and the complexity of the design, and every commission is quoted individually before you commit to anything. Shipping is included in your quote and we deliver worldwide, so it doesn’t matter where you or the recipient are based.

Typical turnaround from design approval to delivery is 2 to 4 weeks. If you have a specific date in mind, a birthday, an anniversary, or another occasion, tell us when you get in touch and we’ll confirm whether the timeline is achievable before you place the order.

Frequently asked questions

What photos do you need to get started?

Clear photos from multiple angles work best. Front, side, and three-quarter views give us the most to work with. For distinctive markings or colouring, close-up photos of those specific features are helpful. Phone photos taken in good natural light are usually fine. If you’re not sure whether your photos are good enough, send them over and we’ll tell you honestly before you commit.

Can you work from older or limited photos?

Yes. For memorial commissions especially, we understand that the photos you have may be limited. We’ll work with what you have, ask questions to fill in any gaps, and take as much time as we need to get the likeness right.

How accurate will the likeness be?

The accuracy of the likeness depends largely on the quality and variety of reference photos we have to work from, on top of this, the larger the model we design the more space it gives us to use to add greater levels of detail. We produce a digital render for your review before any parts are sourced, which gives you the opportunity to request adjustments until you’re satisfied with the design. We don’t move forward until you’re happy with what you see.

What size will the finished model be?

Size is agreed as part of the brief. Most pet portrait commissions are desk-sized pieces, but we can scale the model larger depending on your preference and budget. Tell us what you have in mind and we’ll advise on what works best for the subject.

Do you use genuine bricks?

We build primarily with genuine, brand-name bricks. Where a project calls for it, we also work with a trusted supplier of high-quality compatible bricks. Either way, the standard of the finished model remains the same.

Can I order a pet portrait as a surprise gift?

Yes. Most pet portrait commissions are surprises. We’re discreet throughout the process and can ship directly to you rather than to the recipient. Let us know at the enquiry stage and we’ll manage the process accordingly.

Do you ship internationally?

Yes, worldwide. Shipping is included in your quote so there are no additional charges at delivery.

Get your pet’s portrait made in brick

If you’d like a custom brick portrait of your pet, or if you want to give one as a gift, get in touch with a photo and a brief description of what you have in mind. We’ll come back to you with a quote and next steps.

Pet portrait brick models from £120 / $150. Worldwide shipping included. Every model approved by you before we build.

Looking for a different type of custom model? 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