Sunday, March 2, 2025
Home Blog Page 8

Pricing Animation Services – USD$10,000 Per Minute Might Not Be Enough For an Industry That’s Collapsing… Wait, What?

0


Digital Animator sits at his desk thinking about money.

This post was inspired by an Amateur Animators Facebook Group, public conversation between two professional animators working at entirely different places in their careers but both with at least a decade plus of experience. 

Indy Animator Versus Studio Animator

The conversation centered around an original post by an amateur animator asking if USD$115 payment for a four to five minute, frame by frame animation, was a good deal?

Anyone who has done even one second of frame by frame animation should at least have some concept of how long it would take to make four to five minutes and know that $115 is definitely not a good deal for most people.

However, professional animator one, who I would describe as an independent animator, running a successful content and training business, while not suggesting the deal was good, made the point that there are many factors that go into pricing and that ultimately it is for the individual to set their prices based on what they’re happy to work for.

Our Indy animator also questioned the going rate that several other responders had posted of USD$10,000 per minute, and asked if anyone in the thread actually received that rate, bearing in mind the group is for ‘amateur animators’. A few respondents said they would be happy to charge that rate but no one admitted to actually receiving that rate.

Both these responses seemed to light a fire under professional animator two, who has worked extensively for various high profile studios (including Wētā FX, Electronic Arts) in senior level roles (senior animation director) on major A-list projects (Avatar 2 and She-Hulk to name drop two), that many an amateur animator would likely intern on in a heartbeat just to get a foot in the door (if you’re not familiar with the concept of ‘interns’  they’re often unpaid trainees).

Our Studio animator indicated he had joined the group specifically for this thread to counter argue our Indy animator’s position, which he perceived as endorsing the $115 as a good deal (which he didn’t).

The Studio animator’s main point was that amateur animators shouldn’t be under valuing their work and accepting ridiculously underpaid work from clients who really have no idea of what is involved in actually creating animation.

He argued that the results of animator’s accepting underpaid positions hurt the industry as a whole, allowing employers to assume the cost of creating animation is far less than what it actually is.

Which is partly why, if you tell your average independent business owner that their two minute, fully custom made, animated explainer video is going to cost upwards of USD$15-20 thousand dollars you’ll see their eyes pop out of their head… “It’s animation? I thought it would cost a lot less!”

Our Studio animator was getting increasingly frustrated, and fixated on the idea that our Indy animator was endorsing the original poster’s $115 deal for four to five minutes of animation. To the point where he was sure our Indy animator had deleted said posts and was now back tracking… and it all devolved from there into a bit of a mess.

The State of the Animation Industry

Reading the entire conversation I feel there was some context missing as to why our Studio animator may have been so passionate about even amateur animators under valuing their work.

While I can’t speak for him personally, it’s likely he also feels he isn’t being paid what he is worth, because that is the state of the animation industry as a whole – even for animators working on A-list projects.

If you’re an industry follower you would’ve heard about things like Netflix and Disney, in recent years,  laying off hundreds of animators, cancelling projects that have already begun work etc. You may have heard rumors that the award winning Spider verse animated movies were hell for the animators to work on with poor working conditions. You may have heard about a ‘live’ action Wile E. Coyote, completed movie being permanently shelved.

You may even know that a lot of top level animation projects are outsourced to studios in countries that cost much less to hire.

Then, of course, AI isn’t helping with the perception that you can just type a few sentences and you’ll (in the near future) get a completed animated scene, no actual animator required.

All of these things contribute to animators finding it challenging to leverage at least getting paid what they feel is a reasonable amount… and then professional animators have to contend with the general perception that animation isn’t expensive. Not helped by any animator accepting under valued rates – which clearly is happening at the top level too or successful, award winning animation studios, wouldn’t be struggling or even going out of business (remember the VFX studio that worked on Life of Pi?).

If you want actual context for what I’m talking about watch the video below by YouTuber No the Robot. It’s much more than an AI is coming for your jobs rant. You’ll get a complete overview of what the industry has been dealing with over the past decade since streaming services became a thing, a history of similar issues even Disney’s original animators had to overcome, a look at how AI is hurting the industry (it’s not how you think), and a look forward at how the industry might rise and, hopefully prosper.

If you’ve yet to watch the video please take the time to do so after reading this. Initially I was only going to watch the first five minutes, expecting it to be a cynical rant, but it’s far from that, and really details everything you need to know if working for any major studios is something you aspire to, or you just want to get an overview of top level animation work.

Pricing to Pay Your Living Expenses (This is Just My Approach)

Getting back to the Facebook conversation, I tend to side with our Indy animator to a point. If you are just starting out as a freelance animator any work can be better than no work. How much you charge or are prepared to work for is very much up to you.

You may even consider working for free, if the experience of what you’ll learn is more valuable than getting paid, because that knowledge will let you command higher pay on every job going forward.

However, take the time to know what established animators are getting paid, particularly animators with your experience level and doing the same kind of work. Aim to at least match what they’re charging.

More importantly, when pricing your services as a creative freelancer, know what you need to earn annually to sustain your cost of living (including making a profit) and price accordingly.

In simplistic terms this means if your living expenses are $10,000 annually, you’ll need to at least do either one minute of animation at $10,000 a year to survive, or two minutes at $5000 per minute, or three minutes at $3333 per minute, and so on and so on.

Right now my animation business is a bit of a side hustle so I could get by easily on producing just three minutes of animation a year at $3333 per minute The hustle is finding one, two, or three clients who respect that pricing.

Realistically, pricing is affected by other external factors including things like, but not limited to, what sector of the industry you work in, and who your target clients are, and what type of animation is required. Throwing out a number and asking if it’s a good price is always going to get a wide variety of answers.

For example, nobody is earning $10,000 per minute making one minute animated social media clips, promoting their local Mom and Pop Bakery. Chances are a job like that may be mostly motion graphics with a small amount of character animation that can be made in a day. You don’t know.

But, if you are doing frame by frame animation where you’re actually drawing each frame. Even at 12 frames per second, that’s 720 images you’re drawing for each minute of animation. Remember drawing and, animating in particular, is a special skill that you’re being paid to provide. At least aim to charge an hourly rate higher than basic task work (a cleaner for example) that anyone can learn.

Footnote: While you may have an hourly rate that you use as a guide for quotes I recommend quoting for the entire job and giving a fixed price. Allow for a certain number of revisions, and then make it clear that you will charge for additional revisions once that number is reached. 

Never lock yourself into a fixed price with no provision to invoice for more than a reasonable number of revisions. That way everyone knows how much the work will cost and what it will cost if the client really needs you to do more than initially asked.

o—o— —o— o—

Did you find this article useful?
Subscribe to my newsletter and get the
latest articles delivered to your inbox.

#GTMTips: 10 Useful Custom JavaScript Tricks

0


I recently published a #GTMTips guide called 10 Useful CSS Selectors, and it was very well received. Inspired by the feedback, here’s the next instalment. This time, we’re going over some useful JavaScript tips and tricks that you can use to make your Google Tag Manager deployment even more efficient. I’ve written a lot about JavaScript in this blog, and I intend to keep on doing so in the future. As always, if JavaScript is somewhat of a mystery to you, I strongly recommend you take the Codecademy (free) course on JS, and take a look at the other available web technology tracks while you’re there!


X


The Simmer Newsletter

Subscribe to the Simmer newsletter to get the latest news and content from Simo Ahava into your email inbox!

Tip 54: 10 Useful Custom JavaScript Tricks

You can deploy these tricks in Custom HTML Tags or Custom JavaScript Variables, since they are the only contexts within Google Tag Manager where you can execute arbitrary JavaScript. Note that some of the tricks are just code snippets, so you will need to understand enough of how Google Tag Manager and JavaScript mesh together to be able to deploy them successfully.

Before adding any of these to your deployments, remember to use caniuse.com to check for browser compatibility, and the MDN JavaScript Reference to find alternative ways (AKA polyfills) for writing the unsupported methods.

1. String methods

String methods are utilities that you can use to modify any given string. Here are some of the most useful ones, in my opinion.

// Use .trim() to strip leading and trailing whitespace from a string.
"   Oh no! Leading AND trailing whitespace!!   ".trim();
// Result: "Oh no! Leading AND trailing whitespace!!" 

// Use .replace() to replace characters or regular expressions with something else.
// .replace() without a regular expression replaces the first instance.
"Food".replace('o', 'e');
// Result: "Feod"
"Food".replace(/o/g, 'e');
// Result: "Feed"

// Use .toUpperCase() and .toLowerCase() to change the case of the entire string
"MixED CaSe String".toLowerCase();
// Result: "mixed case string"

// Use .substring() to return only part of the string.
"?some-query-key=some-query-value".substring(1);
// Returns: "some-query-key=some-query-value"
"id: 12345-12345".substring(4,9);
// Returns: "12345"

// Use .split() to split the string into its constituents
"get the second word of this sentence".split(' ')[1];
// Returns "the"

Naturally, you can combine these in inventive ways. For example, to capitalize the first letter of any string you could do this:

var str = "capitalize the first letter of this string, please!";
str = str.replace(/^./, str.substring(0,1).toUpperCase());

Here we first identify the first letter of the string using a regular expression, after which we replace it with the first letter of the string that has been converted to upper case.

2. Array methods

Array methods are really powerful in any programming language. Mastering methods such as filter() and forEach() is critical if you want to make your JavaScript more compact and often more readable.

filter()

filter() goes through each element in the Array, and returns a new Array for every element that passes the check you provide in the callback. Here’s the syntax:

someArray.filter(function(eachItem) { 
  return eachItem === someCondition; 
});

So eachItem is the variable where the iterator stores each member of the Array as it is processed. If the callback returns true, it means that the item is added to the returned, new Array. If it returns false, it’s dropped.

Here’s an example:

window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
  'event' : 'addMe!'
},{
  'event' : 'doNotAddMe!'
});

var newArray = window.dataLayer.filter(function(item) {
  return item.event === 'addMe!';
});
// Returns: [{'event' : 'addMe!'}]

The iterator checks every single item for the property event, and returns true if that property has value addMe!. Thus the returned array only has those elements that have the key-value pair "event" : "addMe!".

forEach()

Remember the clumsy for-loop for iterating over an Array? Yuck! Instead, you can use the forEach() iterator.

forEach() receives each item in the array one-by-one, and you can then do whatever you wish with this item. The syntax is very simple and intuitive, and thus should be preferred over the confusing for-loop.

var array = ["I", 4, 2, true, "love", [1,2,3], {chocolate: 'too'}, "you"];
var newArray = [];

array.forEach(function(item) {
  if (typeof item === 'string') {
    newArray.push(item);
  }
});

newArray.join(" ");
// Result: "I love you"

As you can see, it’s more readable than a for-loop, as you don’t have to access the original array in the iterator.

map()

The map() iterates over each member in the array, again, but this time the code in the callback is executed against each member of the array, and a new array is returned with the results. Here’s how to set it up:

array.map(function(item) {
  return doSomething(item);
});

In other words, you are mapping each element in the array against the result of the callback function. Here’s are some examples:

var array = [1,2,3,4,5];
array.map(function(item) {
  return item * 2;
});
// Result: [2,4,6,8,10]

var array = ["  please     ", "  trim", "     us  "];
array.map(function(item) {
  return item.trim();
});
// Result: ["please", "trim", "us"];

reduce()

The reduce() method is often the most complex one, but it actually has a very simple principle: You provide the function with an accumulator, and each member of the array is then operated against this accumulator. You can also provide an initial value to the accumulator. Here’s what the basic structure looks like:

array.reduce(function(accumulator, item) {
  accumulator.doSomethingWith(item);
  return accumulator;
}, initialValue);

This time, it’s definitely easiest to learn via examples:

// Example: calculate the sum of all even numbers in the array
var array = [1,6,3,4,12,17,21,27,30];
array.reduce(function(accumulator, item) { 
  if (item % 2 === 0) { 
    accumulator += item; 
  }
  return accumulator; 
}, 0);
// Returns: 52

// Example, concatenate a string of all product IDs in array
var array = [{
  "id" : "firstId",
  "name" : "T-shirts"
},{
  "id" : "secondId",
  "name" : "Pants"
},{
  "id" : "thirdId",
  "name" : "shoes"
}];
array.reduce(function(accumulator, item) {
  accumulator.push(item.id);
  return accumulator;
}, []).join();
// Returns: "firstId,secondId,thirdId"

3. Ternary operator

The ternary operator is just a very simple shorthand for running conditional checks in JavaScript. Here’s an example:

// BEFORE:
if (something) {
  somethingElse();
} else {
  somethingDifferent();
}

// AFTER:
something ? somethingElse() : somethingDifferent();

The ternary operator is thus used to combine an if-statement into a simple expression. First you provide an expression that evaluates to a truthy or falsy value, such as me.name() === "Simo". Then you type the question mark, after which you write an expression that is executed if the first item evaluates to a truthy value. Finally, you type the colon :, after which you type the expression that is executed if the first item evaluates to a falsy value.

// BEFORE:
if (document.querySelector('#findThisId') !== null) {
  return document.querySelector('#findThisId');
} else {
  return "Not found!";
}

// AFTER:
return document.querySelector('#findThisId') ? document.querySelector('#findThisId') : "Not found!";

// EVEN BETTER:
return document.querySelector('#findThisId') || "Not found!";

As you can see, sometimes there are even more efficient ways to process JavaScript statements than the ternary operator. Especially when working with simple binary checks (if value exists, return it), it might be better to just use basic logical operators instead of complex statements or expressions.

4. return {{Click URL}}.indexOf({{Page Hostname}}) > -1

This is very Google Tag Managerish. It’s a simple Custom JavaScript Variable that returns true if the clicked element URL contains the current page hostname, and false otherwise. In other words, it returns true if the clicked link is internal, and false if it takes the user away from the website.

function() {
  return {{Click URL}}.indexOf({{Page Hostname}}) > -1;
}

5. return {{Click URL}}.split(‘/’).pop()

Again, a simple Custom JavaScript Variable. This is especially useful when tracking file downloads, as it returns the actual filename of the downloaded item. It does this by returning whatever is in the clicked URL after the last ‘/’.

function() {
  // Example: https://www.simoahava.com/downloads/download_me.pdf
  return {{Click URL}}.split('/').pop();
  // Returns: download_me.pdf
}

6. Create a random, unique GUID

Every now and then it’s useful to create a random ID in GTM. For example, if you want to measure session IDs, or if you want to assign a unique identifier to each page hit, you can achieve this with the following Custom JavaScript Variable.

The variable creates a GUID string (“Globally Unique Identifier”), and even though uniqueness isn’t guaranteed, it’s still very likely. There’s only a microscopically small chance of collision.

This solution is gratefully adapted from this StackOverflow post.

function() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
    return v.toString(16);
  });
}

7. Return an ISO-formatted timestamp

This is one of my favorite solutions, as it lets you convert the current client time to a proper, readable timestamp. In addition, it has the timezone offset included, so you’ll know just how much the users’ local times differ from your own timezone. I send this to Google Analytics with every single hit, so that I can create a timeline of events when analyzing the data.

This solution is gratefully adapted from this StackOverflow post.

function() {
  var now = new Date();
  var tzo = -now.getTimezoneOffset();
  var dif = tzo >= 0 ? '+' : '-';
  var pad = function(num) {
    var norm = Math.abs(Math.floor(num));     
    return (norm < 10 ? '0' : '') + norm;
  };
  return now.getFullYear() 
    + '-' + pad(now.getMonth()+1)
    + '-' + pad(now.getDate())
    + 'T' + pad(now.getHours())
    + ':' + pad(now.getMinutes()) 
    + ':' + pad(now.getSeconds())
    + '.' + pad(now.getMilliseconds())
    + dif + pad(tzo / 60) 
    + ':' + pad(tzo % 60);
  // Returns, for example: 2017-01-18T11:58:32.977+02:00
}

8. .matches() polyfill

When working with the Document Object Model (DOM), being able to identify elements is crucial. We already have a bunch of wonderful CSS selectors at our disposal, but now we just need a method we can use to check if any given element matches one of these selectors.

Well, there’s the Element.matches(someSelector) method that you can use, but it doesn’t have stellar browser support, even with prefixes. With this solution, you can always use .matches() without having to worry about browser support. This trick is called a polyfill, as it patches lack of feature support with a workaround using JavaScript that is universally supported.

First, here’s how the method works in general:

// Check if the parent of the clicked element has ID #testMe
var el = {{Click Element}};
console.log(el.parentElement.matches('#testMe'));
// RESULT: true or false, depending on if the parent element matches the selector.

To implement the polyfill, either ask your developers to add it to the site JavaScript as early as possible in the page load sequence, or use Google Tag Manager.

In Google Tag Manager, you’ll need a Custom HTML Tag that fires as early as possible in the container load sequence (i.e. All Pages trigger with a high tag priority).

Here’s the code you need to add to the Custom HTML Tag. It’s gratefully adapted from this MDN reference page.

<script>
  if (!Element.prototype.matches) {
    Element.prototype.matches = 
      Element.prototype.matchesSelector || 
      Element.prototype.mozMatchesSelector ||
      Element.prototype.msMatchesSelector || 
      Element.prototype.oMatchesSelector || 
      Element.prototype.webkitMatchesSelector ||
      function(s) {
        var matches = (this.document || this.ownerDocument).querySelectorAll(s),
            i = matches.length;
        while (--i >= 0 && matches.item(i) !== this) {}
        return i > -1;            
      };
  }
script>

The polyfill modifies the actual prototype of the Element object, which all HTML and DOM elements inherit from. After modifying the prototype, you can use the matches() method with confidence in all your GTM and site JavaScript.

9. DOM traversal

Sometimes it’s necessary to climb up (or down) the Document Object Model. For example, if you’re using a Click / All Elements trigger, it always targets the actual element that was clicked. But that’s not always necessarily the element you want to track! Say you have an HTML structure like this:

<a href="takemeaway.html">
  <button id="clickMe">
    <span>Click Me!span>
  button>
a>

Now, if you use a Click / All Elements trigger, the element that is captured in the click is the . But I’m guessing you actually want to use the element, since you’re more interested in knowing what happens after the click. So, you can use this Custom JavaScript Variable to return the nearest link above the clicked element in the DOM tree:

function() {
  var el = {{Click Element}};
  while (!el.matches('a') && !el.matches('body')) {
    el = el.parentElement;
  }
  return el.matches('a') ? el : undefined;
}

NOTE! This relies on the matches() method, so don’t forget to implement the polyfill from above, first!

This Custom JavaScript Variable climbs up the DOM until it reaches the first link element it finds ('a'), after which it returns this element. If it doesn’t find a link, it returns undefined instead.

10. Set browser cookies with ease

Cookies are a great, if somewhat outdated, way of storing information in the browser. Since Google Tag Manager operates in the context of a web page, it is essentially stateless. Thus any information you want to persist from one page to another must be stored either in the server or the browser itself. The latter is far easier to do, and with browser cookies it’s just a question of adding a couple of lines of code to your GTM deployment.

First, you need a Custom JavaScript Variable. You can name it {{Set Cookie}}, for example.

function() {
  return function(name, value, ms, path, domain) {
    if (!name || !value) {
      return;
    }
    var d;
    var cpath = path ? '; path=' + path : '';
    var cdomain = domain ? '; domain=' + domain : '';
    var expires = '';
    if (ms) {
      d = new Date();
      d.setTime(d.getTime() + ms);
      expires = '; expires=' + d.toUTCString();
    }
    document.cookie = name + "=" + value + expires + cpath + cdomain;
  }
}

This Custom JavaScript Variable returns a function that takes five parameters:

  • name (required): the name of the cookie (string)

  • value (required): the value of the cookie (string)

  • ms: expiration time of the cookie in milliseconds. If unset, defaults to a Session cookie (expires when the browser is closed).

  • path: the path of the cookie. If unset, defaults to the current page path.

  • domain: the domain of the cookie. If unset, defaults to the current domain.

To use the cookie, you invoke it with:

{{Set Cookie}}('test', 'true', 10000, '/', 'simoahava.com');

The code above, when run in GTM, sets a cookie with name "test", value "true", expiration time of ten seconds, and it’s set on the root of the simoahava.com domain.

With this helper, setting cookies is a breeze. Remember that you can then use the handy 1st Party Cookie variable in GTM to retrieve values from set cookies.

Summary

Here I listed 10 JavaScript tricks that I use (almost) all the time. There’s plenty more to JavaScript, but with these methods you can get started on making your clunky Google Tag Manager deployment a thing of the past.

Do you have any favorite methods, tips, or tricks you want to share? Please do so in the comments below.

Rescuing Mussolini: The Fallschirmjäger Gran Sasso Raid — History is Now Magazine, Podcasts, Blog and Books

0


By 1943, the tide of the Second World War was turning against the Axis powers. In Italy, internal dissent reached a crescendo with the overthrow of Benito Mussolini, (Duce). Several of his colleagues were close to revolt, and Mussolini was forced to summon the Grand Council on the July 24, 1943. This was the first time the body had met since the start of the war. When he announced that the Germans were thinking of evacuating the south, Grandi launched a blistering attack on him. Grandi moved a resolution asking the king to resume his full constitutional powers—in effect, a vote of no confidence in Mussolini.

Thus on July 25, 1943, by order of King Victor Emmanuel III, Mussolini was arrested, he was moved to various locations to prevent any rescue attempts by his German allies. His final and most secure prison was the Hotel Campo Imperatore, situated high on the Gran Sasso massif in the Apennine Mountains.

Adolf Hitler was determined to rescue Mussolini, the task was assigned to the Luftwaffe’s elite Fallschirmjäger under the command of General Kurt Student. Concurrently, Hitler ordered the SS, represented by the ambitious Otto Skorzeny, to get involved in the operation to track and identify the location where Mussolini was being held. This dual-command structure sowed the seeds for future credit disputes, a situation that plagued many German operations throughout the war, not only concerning credit but in some cases detrimental to a number Nazi operations.

The planning of Operation Gran Sasso began with exhaustive intelligence gathering. The Fallschirmjäger, known for their meticulous preparations, used reconnaissance flights to gather aerial photographs and detailed maps of the hotel and surrounding terrain that Otto Skorzeny had identified. They analyzed weather conditions, altitude challenges, and potential escape routes.

 

Key Elements of the Plan:

1.   Aerial Assault: The only feasible approach to the heavily guarded hotel was from the air. The Fallschirmjäger, experienced in airborne operations, planned a glider-borne assault. Gliders, being silent and capable of landing in confined space in a concentration of force, were ideal for the mission.

2.   Surprise and Speed: The element of surprise was paramount. The plan was to land gliders on the narrow plateau near the hotel, overpower the guards, and secure Mussolini swiftly before any reinforcements could arrive.

3.   Command Structure: While the Fallschirmjäger were responsible for the operational details, Otto Skorzeny, with no prior experience in airborne operations, was included in the planning due to his SS ties and Hitler’s directives. His role was ostensibly to assist and ensure SS involvement.

 

However, due to his personality, Skorzeny aimed to use the mission as an opportunity to promote his ideas of unconventional warfare, as he had studied the successes of British special operations.

On September 12, 1943, the meticulously planned operation was put into action. The operation, codenamed Unternehmen Eiche (Operation Oak), commenced with a formation of ten DFS 230 gliders, towed by Heinkel He 111 aircraft, departing from Pratica di Mare near Rome, carrying the elite Fallschirmjäger troops, and Otto Skorzeny with 16 SS assault troops.

 

Key Phases of the Execution:

1.   Aerial Approach: The gliders, piloted by experienced Fallschirmjäger, detached from their tow planes at the precise moment and began their silent descent towards the Gran Sasso plateau. The challenging mountainous terrain required expert navigation to avoid detection and ensure a safe landing.

2.   Landing and Assault: Despite the difficult terrain, the gliders landed with remarkable precision near the hotel. The operational commander, (Oberleutnant Georg Freiherr), led the Fallschirmjäger in a swift assault. They quickly overwhelmed the Italian guards, who were caught off guard by the sudden appearance of German troops. (It is argued later that a number of the guards were pro-Mussolini and some welcomed the German’s arrival).

3.   Securing Mussolini: Skorzeny, eager to assert his presence, was among the first to reach Mussolini. Ensuring he was visibly at the forefront, Skorzeny famously declared to Mussolini, “Duce, the Führer has sent me to set you free!” This moment, captured in photographs, was crucial for Skorzeny’s later claims of leadership.

4.   Evacuation: With Mussolini secured, the team signaled for the waiting Fieseler Fi 156 Storch aircraft. The rugged terrain made the takeoff challenging, especially since Skorzeny had insisted on accompanying Mussolini even though the plane was only suitable for the Duce and the pilot. However, with great skill Captain Gerlach, managed to lift off with Mussolini and Skorzeny onboard.

 

The operation was a resounding success, achieved with only two Italians killed and two slightly wounded. Mussolini was flown to Vienna and then to Germany, where he was greeted as a hero. However, the real battle was just beginning – the battle for credit.

Skorzeny, with his flair for drama and self-promotion, was quick to present himself as the mastermind of the operation. His SS connections and personal rapport with Hitler gave him a significant advantage. The iconic photographs of him with Mussolini bolstered his narrative. He was awarded the Knight’s Cross of the Iron Cross, and his fame soared.

In contrast, the contributions of the Fallschirmjäger, who had meticulously planned and executed the mission, were overshadowed, despite their pivotal role, and received comparatively little recognition. The post-war narratives, influenced by Skorzeny’s memoirs and his relentless self-promotion, further cemented his legend.

While Otto Skorzeny’s role in Operation Gran Sasso cannot be entirely dismissed, simply because Skorzeny not only identified Mussolini’s location, in addition to, the fact that he was present with his men but also because he had suggested the exact landing zone for the gliders. However, it is essential to recognize the contributions of the Fallschirmjäger. The success of the mission was a true testament to their planning, skill, and bravery. Skorzeny’s presence, though significant, was more of a political maneuver to ensure SS involvement and claim the glory.

Recent historical analyses have sought to rectify this imbalance. Military historians emphasize the Fallschirmjäger’s expertise in airborne operations and highlight the comprehensive planning by General Kurt Student’s elite Fallschirmjäger. These reassessments underscore the collaborative nature of the mission, with the Fallschirmjäger’s groundwork being crucial to its success.

 

Conclusion

In conclusion, Operation Gran Sasso remains one of the Second World War’s most dramatic and daring missions. The successful rescue of Mussolini was a remarkable feat of military precision, courage and flying ability. While Otto Skorzeny emerged as the public face of the mission, it was the meticulous planning and execution by the German Fallschirmjäger that ensured the success of the mission.

In the broader context of military history, Operation Gran Sasso serves as a reminder of the complexities of war, where deeds on the battlefield often become intertwined with political machinations and personal ambitions. The Fallschirmjäger, though overshadowed in popular narratives, remain the true heroes of this audacious operation, exemplifying the skill and bravery that defined Germany’s elite paratroopers. These characteristics were true for all airborne operations of the Second World War for both Axis and Allied airborne forces and still are of airborne forces today.

 

Find that piece of interest? If so, join us for free by clicking here.

Sample Product 2

0

This is a description for product 2.

Buy Now

Sample Product 1

0

This is a description for product 1.

Buy Now

Kristof Bathory – Black Hole Expedition (2025; Cryo Chamber) – Avant Music News

0


The latest from Kristof Bathory is a set of drones, atmospheres, and rhythmic patterns that collectively tell a story of a doomed stellar exploration. The narrative is made clear by a lengthy voiceover on the first track that accompanies slow-moving, hazy chords and a pounding synth-driven pulse.

Unlike many experimental ambient offerings, Black Hole Expedition exhibits a relatively strong sense of structure. This includes the aforementioned rhythms, as well as haunting melodic passages that repeat for minutes on end. For example, Stellar Retrieval features a five-note motif that shares space with a darkly shimmering background drone and a brighter set of foreground chords.

The remaining tracks stick to this general approach. Each has its own combination of themes, progressions, rhythms, and textures – whether shifting waves of sound, electro-mechanical noises, or sequenced figurations of notes. The overall feel is borderline post-industrial with a cinematic science fiction flair. Averaging around nine minutes apiece, these seven tracks offer Bathory space to experiment and evolve his sound by thoroughly exploring and expanding upon these ideas.

Heart Shape for Crystals #restrelaxationreiki #crystalenergy #sacredgeometry



Heart Shape for Crystals #restrelaxationreiki #crystalenergy #sacredgeometry

Glenglassaugh Sandend Highland Single Malt Scotch Whisky Review – It’s just the booze dancing…

0


Booze Dancing TV

There are two kinds of whisky people. Those that like to brag about their latest purchase. And then there are those that like to share their latest purchase with friends because let’s face it, whisky always tastes better when it’s shared. Our dear friend Rob is one of those whisky sharers. We like Rob.

The subject of today’s review is a recent Rob purchase which he lent us to review. The bottle came to us unopened so that we would be the first to have a crack at it.

The name of this whisky is the Glenglassaugh Sandend. It’s a Highland Single Malt Scotch Whisky which was declared the 2023 Whisky of the Year in a recent issue of Whisky Advocate. They gave it a 95! We’re here to find out if it’s worthy of such high praise.

Here are a few words about this whisky from the distillery website:

Glenglassaugh Sandend is inspired by the crescent beach of Sandend Bay where the distillery resides. Enriched in bourbon, sherry and manzanilla casks, over time the lush flavour of Glenglassaugh Sandend brightens into waves of tropical sweetness, infused with a crack of sea salt.

50.5% ABV

This all sounds delicious! Click play on the following video to find out if it actually was:

If you like what you saw and heard, please subscribe to our blog and YouTube Channel. It’s the easiest and BEST way to find out what we’ll be tasting next!

English Only, No Translation Necessary — Carol ReMarks

0


English Only – Donald Trump makes it so.

Donald Trump just signed another executive order (EO) making English the official language of the United States. Wait, what? Wasn’t that already a thing? I mean, come on—’Merica! The land where English reigns supreme, or so we thought. But apparently, the man who made “You’re fired!” a household phrase feels the need to solidify that the national language is, in fact, the one you hear in every corner of the country—whether it’s on the nightly news or a fast-food drive-thru. So, this move begs the question: What exactly are we fixing here?

Well, I’m not sure we’re actually fixing anything with this order, but I’ll admit, I’m on board with the sentiment. We’ve seen our borders overrun by people from multiple countries—illegally, mind you—and it’s been a growing issue for years. It’s hard to ignore the strain on resources, the confusion around language barriers, and the overall chaos that comes with an influx of undocumented immigrants. While declaring English the official language might not be the magic solution to these complex problems, at least it’s a step toward enforcing some semblance of unity. But let’s not kid ourselves; the real issue lies at the border, and that’s where the focus should be.

The Need

Estimates of the number of undocumented immigrants residing in the United States vary among different sources. According to the U.S. Department of Homeland Security, as of January 2022, there were approximately 10.5 million unauthorized immigrants in the country.

Similarly, Pew Research Center estimated the unauthorized immigrant population to be 10.5 million in 2021.

However, a study from Yale University suggests that the actual number could be as high as 22 million, indicating that previous estimates might have underestimated the population.

These discrepancies highlight the challenges in accurately counting unauthorized immigrants due to factors such as their transient nature and reluctance to participate in surveys. So yeah, probably closer to the Yale number.

I can understand the idea behind pushing for an official language—it taps into that old notion of immigrants needing to assimilate like they did in the past. There’s a certain appeal to the idea that everyone should speak the same language, fostering a sense of unity and shared identity. It’s easy to look back and romanticize how previous waves of immigrants were able to adapt and thrive by embracing English. But, the reality is, the world—and immigration—has changed a lot since then. So, while the idea of an official language might seem like a way to ensure smoother integration, it’s not necessarily the whole solution to the challenges we face today.

The Critics

We now have The Gulf of America, so why not have our official language, finally? Of course, the lefty lame stream media is having a hissy fit, calling it racism and xenophobia.

Trump Set to Sign Pandering, Racist Order—on the English Language
Donald Trump, who can barely speak the English language himself, is planning to sign another useless executive order.

[…]

The U.S. has never had a national language in its entire history, and the country has typically prided itself on being a land of immigrants from all over the world. The order will end a Clinton-era federal mandate that requires federal agencies and other recipients of federal aid to provide non-English speakers with language assistance. –  The New Republic

 

Well, New Republic, those days are over. We no longer want to be the land of immigrants from all over the world.

This order doesn’t take away government agencies’ ability to stop printing material in other languages; it just means they are no longer forced to do so.

“In welcoming new Americans, a policy of encouraging the learning and adoption of our national language will make the United States a shared home and empower new citizens to achieve the American dream,” the executive order states.

[…]

Trump’s executive order represents a return to the melting pot ideal that made America successful: a place where people from different backgrounds unite under a common identity, language, and culture. This shouldn’t be controversial; it’s fundamental to maintaining our national cohesion. – PJ Media

 

The melting pot concept is about diverse cultural backgrounds coming together to create—and then preserve—a unified nation. It’s about assimilating newcomers into our ideals, dreams, values, and traditions. The melting pot makes America stronger as one nation under God. But if we allow separate factions of different nationalities to exist in isolation, we lose the essence of the melting pot. A true melting pot doesn’t just coexist—it blends, forging one cohesive identity where unity is greater than division.

It doesn’t surprise me in the least that progressives oppose making English the official language. After all, they’re the ones who champion the idea of dividing people into smaller, self-identified circles. Just look at the LGBTQ+ movement as an example—while it’s important to honor diversity, the constant focus on breaking people into ever-more specific categories can make it harder to find common ground. Making English the official language isn’t about erasing diversity, it’s about fostering a shared foundation in which everyone can connect, no matter their background.

Feature Image: Created in Canva Pro


carol marks, carol remarks, carol remarks blogCarol Marks has been blogging since the early ’90s, covering glamour, pop culture, and front-page news. She hosts The Carol ReMarks podcast, contributes to the conservative Victory Girls Blog, and is a proud member of Give Me Liberty Media.



American AAdvantage Loyalty Point Rewards: Which Perks To Pick

0


Nowadays American AAdvantage has the Loyalty Points system for status qualification. Your elite status is exclusively based on how many Loyalty Points you rack up. Not only can you earn Loyalty Points through flying, but you can also earn them through all kinds of other activities, from using shopping portals to credit card spending.

In this post, I want to cover the details of the Loyalty Point Rewards benefits, which are earned by passing certain Loyalty Points thresholds over the course of the membership year. This is a large part of the value proposition of going for elite status with the AAdvantage program.

I’m covering this as the 2025-2026 AAdvantage program year has just launched (as of March 1, 2025), and there were some minor tweaks to the Loyalty Point Rewards program as of this membership year.

What are American Loyalty Point Rewards?

With the AAdvantage program, you earn status exclusively based on how many Loyalty Points you rack up (they reset with each membership year). Here are the current requirements for the program:

Since you can earn Loyalty Points through credit card spending and other partner activity, you could in theory earn all published AAdvantage elite tiers without stepping foot on a plane (though that wouldn’t make a whole lot of sense).

Separate from earning elite status, American also has Loyalty Point Rewards, which offer further valuable benefits at a variety of thresholds. These perks range from bonus miles, to mileage rebates, to lounge memberships, to systemwide upgrades.

American AAdvantage status is earned based on Loyalty Points

American’s Loyalty Point Rewards thresholds & choices

American AAdvantage offers 11 tiers of Loyalty Points Rewards. You can even start unlocking these before you qualify for status. To start, here are the 11 Loyalty Points thresholds at which you receive further rewards:

  • 15,000 Loyalty Points
  • 60,000 Loyalty Points
  • 100,000 Loyalty Points
  • 175,000 Loyalty Points
  • 250,000 Loyalty Points
  • 400,000 Loyalty Points
  • 550,000 Loyalty Points
  • 750,000 Loyalty Points
  • 1,000,000 Loyalty Points
  • 3,000,000 Loyalty Points
  • 5,000,000 Loyalty Points

A few things to note when it comes to selecting Loyalty Points Rewards:

  • You no longer receive a selection when you qualify for Platinum Pro or Executive Platinum, but rather valuable Loyalty Point Rewards are earned at thresholds that are 50,000 Loyalty Points above what’s required for those tiers (namely 175,000 and 250,000 Loyalty Points)
  • At some thresholds you’ll just receive specific benefits, while at other thresholds you can make a selection, or even make multiple selections
  • There’s no segment requirement to unlock Loyalty Point Rewards, so you can earn these even if you never step foot on an American Airlines flight
  • The AAdvantage program year doesn’t follow the traditional calendar year, but rather goes from the beginning of March until the end of February of the following year — this means the 2025-2026 program year goes from March 1, 2025, until February 29, 2026, and then status is valid through March 31, 2027
  • Once you qualify for Loyalty Point Rewards, you’ll have until March 31 (a month after the end of the membership year) to make your selection; it could make sense to wait to make your selection, since you never know how your travel demands will evolve

With that out of the way, what are the Loyalty Points Rewards options at each threshold for the 2025-2026 membership year, and which should you select? Let’s go over all the details.

Loyalty Point Rewards at 15,000 Loyalty Points

When earning 15,000 Loyalty Points, you receive Group 5 boarding for the membership year, and can select one of the following:

  • Priority check-in, security, and Group 4 boarding for one trip
  • Five preferred seat coupons
  • 1,000 Loyalty Points toward status
  • A personalized luggage tag

If you’re not an AAdvantage elite member, then there could be merit to selecting either the priority benefits or preferred seat coupons. Meanwhile if you’re an elite member, you’ll probably want to select the 1,000 bonus Loyalty Points, since it gets you closer to requalifying for status.

Select preferred seating coupons with Loyalty Point Rewards

Loyalty Point Rewards at 60,000 Loyalty Points

When earning 60,000 Loyalty Points, you receive:

  • Avis Preferred status
  • A 20% Loyalty Points bonus on spending with AAVacations, AAHotels, AAdvantage eShopping, AAdvantage Dining, and SimplyMiles

As you can see, there’s no selection here. I’d say this threshold is of fairly limited value. Avis entry level elite status is better than nothing, but not much more than that. A 20% bonus of Loyalty Points for some online activity could be helpful if you earn lots of Loyalty Points through non-flying means.

Receive bonus Loyalty Points for dining out with Loyalty Choice Rewards

Loyalty Point Rewards at 100,000 Loyalty Points

When earning 100,000 Loyalty Points, you receive:

  • Avis President’s Club status
  • A 30% Loyalty Points bonus on spending with AAVacations, AAHotels, AAdvantage eShopping, AAdvantage Dining, and SimplyMiles
  • World of Hyatt Discoverist status

As you can see, there’s no selection here, but rather you receive all three things. On the plus side, Avis President’s Circle status at least offers a bit more value than the entry level status, and Discoverist is World of Hyatt’s entry level status, and offers modest value. A 30% bonus of Loyalty Points for some online activity could be helpful if you earn lots of Loyalty Points that way.

Receive rental car status with Loyalty Point Rewards

Loyalty Point Rewards at 175,000 Loyalty Points

When earning 175,000 Loyalty Points, you can choose one of the following:

  • Two systemwide upgrades
  • 20,000 bonus miles, or 25,000 bonus miles for AAdvantage credit card members
  • Six Admirals Club day passes
  • A $200 trip credit, or $250 for AAdvantage credit card members
  • A $250 donation to a partner charity
  • The ability to gift AAdvantage Gold status to two people
  • 35,000 AAdvantage miles toward a Mastercard Priceless Experience (only for AAdvantage credit card members)
  • 5,000 Loyalty Points toward status
  • World of Hyatt Explorist status

This is where Loyalty Point Rewards start to get valuable. Personally I think the two systemwide upgrades are the best value here, though selecting 25,000 AAdvantage bonus miles could be a good option as well, if you don’t have much luck with systemwide upgrades. Explorist is World of Hyatt’s mid level status, and while it offers some value, I think the opportunity cost is too high.

Select systemwide upgrades with Loyalty Point Rewards

Loyalty Point Rewards at 250,000 Loyalty Points

When earning 250,000 Loyalty Points, you can choose two of the following:

  • Two systemwide upgrades
  • 20,000 bonus miles, or 30,000 bonus miles for AAdvantage credit card members
  • Six Admirals Club day passes
  • An Admirals Club membership (this requires both choices)
  • A $200 trip credit, or $250 for AAdvantage credit card members
  • A $250 donation to a partner charity
  • The ability to gift AAdvantage Gold status to two people
  • A selection of Bang & Olufsen products (this requires both choices)
  • A Flagship Lounge single visit pass, or two passes for AAdvantage credit card members
  • 35,000 AAdvantage miles toward a Mastercard Priceless Experience (only for AAdvantage credit card members)
  • 15,000 Loyalty Points toward status

For many AAdvantage members, this will be the most valuable Loyalty Point Rewards tier, since it’s attainable and rewarding. Personally I think the two systemwide upgrades are the best value here, though selecting 30,000 AAdvantage bonus miles could be a good option as well, if you don’t have much luck with systemwide upgrades.

Select bonus AAdvantage miles with Loyalty Point Rewards

Loyalty Point Rewards at 400,000, 550,000, and 750,000 Loyalty Points

When earning 400,000, 550,000, or 750,000 Loyalty Points, you can choose two of the following at each threshold:

  • One systemwide upgrades
  • 25,000 bonus miles
  • An Admirals Club membership (this requires both choices)
  • A $200 trip credit, or $250 for AAdvantage credit card members
  • The ability to gift AAdvantage Platinum status
  • A selection of Bang & Olufsen products (this requires both choices)
  • Two Flagship Lounge single visit passes
  • One Flagship First Dining visit pass
  • 40,000 AAdvantage miles toward a Mastercard Priceless Experience (only for AAdvantage credit card members)
  • A World of Hyatt Category 1-4 free night award

It’s interesting how for these three thresholds, the relative value of the options changes. At these thresholds, I tend to think that for many, selecting the bonus miles could be a better value than selecting the single systemwide upgrade.

For what it’s worth, a Hyatt Category 1-4 free night award is worth up to 18,000 World of Hyatt points, and I value World of Hyatt points and American AAdvantage miles roughly equally. So it’s not the option I’d select, personally.

Select a Flagship First Dining pass with Loyalty Point Rewards

Loyalty Point Rewards at 1,000,000 Loyalty Points

When earning 1,000,000 Loyalty Points, you can choose one of the following:

  • Four systemwide upgrades
  • The ability to gift AAdvantage Platinum Pro status
  • A mileage rebate of 100,000 AAdvantage miles
  • 150,000 AAdvantage miles toward a Mastercard Priceless Experience (only for AAdvantage credit card members)
  • A World of Hyatt Category 1-7 free night award

You can’t go wrong with any of the options here. Four systemwide upgrades could be quite valuable, being able to gift Platinum Pro to someone (with oneworld Emerald status) is great, and a mileage rebate of 100,000 miles is also excellent.

For what it’s worth, a Hyatt Category 1-7 free night award is worth up to 35,000 World of Hyatt points, and I value World of Hyatt points and American AAdvantage miles roughly equally. So it’s not the option I’d choose, given the opportunity cost.

Gift someone oneworld Emerald status with Loyalty Point Rewards

Loyalty Point Rewards at 3,000,000 Loyalty Points

When earning 3,000,000 Loyalty Points, you can choose one of the following:

  • Six systemwide upgrades
  • The ability to gift AAdvantage Executive Platinum status
  • A mileage rebate of 300,000 AAdvantage miles
  • 350,000 AAdvantage miles toward a Mastercard Priceless Experience (only for AAdvantage credit card members)
  • A World of Hyatt Category 1-7 free night award

Okay, I can’t imagine many people will reach this threshold, but once again, all the options could be valuable, perhaps with the exception of the Hyatt free night award. It all depends on your travel patterns.

Gift someone Executive Platinum status with Loyalty Point Rewards

Loyalty Point Rewards at 5,000,000 Loyalty Points

When earning 5,000,000 Loyalty Points, you can choose one of the following:

  • 10 systemwide upgrades
  • The ability to gift AAdvantage Executive Platinum status
  • A mileage rebate of 500,000 AAdvantage miles
  • 550,000 AAdvantage miles toward a Mastercard Priceless Experience (only for AAdvantage credit card members)
  • A World of Hyatt Category 1-7 free night award

I imagine the people reaching this threshold is very low. The relative value of systemwide upgrades and the mileage rebate is better here compared to the tier at three million Loyalty Points.

Select a mileage rebate with Loyalty Point Rewards

My take on American’s Loyalty Points Rewards

Everyone will value these Loyalty Point Rewards benefits differently based on their travel patterns and preferences, though I’ll share my broad take on which options make sense:

  • Personally I value American AAdvantage miles at 1.5 cents each, so to me the bonus miles are the option to beat; if you rack up 250,000 Loyalty Points in a year and have a co-branded American credit card, you’ll essentially have the option of 55,000 AAdvantage bonus miles, four systemwide upgrades, or some combination thereof
  • I find the inconsistency of the valuation of awards at each tier to be odd; for example, at some thresholds you can choose between 25,000 bonus miles or one systemwide upgrade, while at other thresholds you can choose between 25,000 bonus miles and two systemwide upgrades
  • Many people may like the systemwide upgrades, but personally I don’t value them that much; American just doesn’t make enough confirmable upgrade space available, and I’d rather get AAdvantage bonus miles I can redeem however I’d like for travel on superior partner airlines
I’d rather earn AAdvantage miles I can redeem on other airlines

Bottom line

American AAdvantage offers the Loyalty Points Rewards program, whereby members can receive rewards for passing certain thresholds. These rewards aren’t tied to earning specific status tiers, but rather are intended to create an incremental incentive to be loyal to the airline. This program lets you select everything from systemwide upgrades to bonus miles, and more.

What do you make of American’s Loyalty Point Rewards? Which do you plan on selecting?

Skip to toolbar