{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "3D Library: posts tagged after effects",
    "_rss_description": "A curated library of useful motion design insights, tips and tricks for quick reference and practical guidance",
    "_rss_language": "en",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/balyberdin.com\/library\/tags\/after-effects\/",
    "feed_url": "https:\/\/balyberdin.com\/library\/tags\/after-effects\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Vitaly Balyberdin",
            "url": "https:\/\/balyberdin.com\/library\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "4",
            "url": "https:\/\/balyberdin.com\/library\/all\/ae-expressions\/",
            "title": "After Effects Expressions Cheat Sheet",
            "content_html": "<p>I’ve put together a list of After Effects expressions that simplify my workflow. You won’t find basics like <f>loopOut()<\/f> or <f>wiggle (.4,6)<\/f> here, but nothing overly complex either.<\/p>\n<p>Most of these expressions are taken from the web and adapted to fit my needs, with only a few being entirely my own. I’ve included links to credit the authors where relevant.<\/p>\n<h2>Adaptive Text Box<\/h2>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp-text_02_@loop.mp4#t=0.001\" width=\"1280\" height=\"560\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Auto-resize the shape layer bounding box to the text length.<\/p>\n<p>Create a rectangle shape and add a text layer above it.<br \/>\nApply this expression to the <f>Size<\/f> parameter of the shape layer:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">margin_width = 60;\nmargin_height = 40;\n\ntext_width = thisComp.layer(index-1).sourceRectAtTime().width;\ntext_height = thisComp.layer(index-1).sourceRectAtTime().height;\n\nbox_width = text_width + margin_width*2;\nbox_height = text_height + margin_height*2;\n\n[box_width, box_height]<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/creativecow.net\/forums\/thread\/changing-shape-layers-size-width-due-to-text-width\/\">© Kalleheikki Kannisto<\/a><\/p>\n<p>For multi-line text, apply this additional expression to the <f>Position<\/f> of the shape layer. This automatically aligns the shape’s position with the text.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">x = value[0];\ny = content(&quot;Rectangle 1&quot;).content(&quot;Rectangle Path 1&quot;).size[1]\/2;\n[x,y]<\/code><\/pre><h2>Animated Wiggle<\/h2>\n<p>Easily animate wiggle using two sliders: one controls the frequency, and the other controls the amplitude. For the best results, animate only amplitude.<\/p>\n<p>Add two <f>Slider Controls<\/f> to the layer and apply this expression:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">w_freq = effect(&quot;Slider Control&quot;)(&quot;Slider&quot;);\nw_amplitude = effect(&quot;Slider Control 2&quot;)(&quot;Slider&quot;);\n\nwiggle(w_freq,w_amplitude)<\/code><\/pre><h2>Looping Wiggle<\/h2>\n<p>With this expression, wiggle starts and ends at the same point.<\/p>\n<p>If it doesn’t loop correctly, it’s likely because the loop time is too short for wiggle to return to the starting point. Just increase <f>loopTime<\/f> or <f>freq<\/f>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">freq = 1;\namp = 65;\n\nstartTime = 0; \/\/ Loop start time\nloopTime = 3; \/\/ Loop duration in seconds\n\nt = (time+startTime) % loopTime;\nwiggle1 = wiggle(freq, amp, 1, 0.5, t);\nwiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);\n\nlinear(t, 0, loopTime, wiggle1, wiggle2)<\/code><\/pre><p class=\"foot\"><a href=\"http:\/\/www.motionscript.com\/design-guide\/looping-wiggle.html\">© Dan Ebberts<\/a><\/p>\n<h2>Pin Shape Layer to One Side<\/h2>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp_size-2_02_@loop.mp4#t=0.001\" width=\"1280\" height=\"560\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Keep one of the shape’s sides fixed while adjusting the <f>Size<\/f>.<\/p>\n<p>Apply this expression to the <f>Position<\/f> of a shape layer:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">pinTo = &quot;left&quot;; \/\/ top, bottom, right or left\nchosenShape = content(&quot;Rectangle 1&quot;).content(&quot;Rectangle Path 1&quot;);\n\nif (pinTo == &quot;top&quot;){\n     x = chosenShape.position[0];\n     y = chosenShape.position[1]+chosenShape.size[1]\/2;\n}\n\nelse if (pinTo == &quot;bottom&quot;){\n     x = chosenShape.position[0];\n     y = chosenShape.position[1]-chosenShape.size[1]\/2;\n}\n\nelse if (pinTo == &quot;right&quot;){\n     x = chosenShape.position[0]-chosenShape.size[0]\/2\n     y = chosenShape.position[1]\n}\n\nelse if (pinTo == &quot;left&quot;){\n     x = chosenShape.position[0]+chosenShape.size[0]\/2;\n     y = chosenShape.position[1]\n}\n\n[x,y]<\/code><\/pre><h2>Rolling Circle and Square Rig<\/h2>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp_rolling_rig_02_@loop.mp4#t=0.001\" width=\"1280\" height=\"560\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><h3>Rolling Circle<\/h3>\n<p>Apply this to the <f>Rotation<\/f> and animate the <f>Position<\/f>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">transform.position[0]-(content(&quot;Ellipse 1&quot;).content(&quot;Ellipse Path 1&quot;).size[0]\/2)-transform.position[0]\/2<\/code><\/pre><h3>Rolling Square<\/h3>\n<p>This expression works with shapes, layers and compositions.<\/p>\n<p>Apply the expression to the <f>Position<\/f>. Add a <f>Slider Control<\/f> to the same layer. Animate the <f>Rotation<\/f>. If the square doesn’t roll correctly, adjust the <f>Slider Control<\/f>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">targetLayer = thisLayer;\nsquareSize = targetLayer.sourceRectAtTime().width;\nsquareDiag = (Math.sqrt(2)*squareSize)\/2\/3.5;\n\ntry{\n    squareOffset = effect(&quot;Slider Control&quot;)(&quot;Slider&quot;);\n}\n\ncatch(err) {\n    squareOffset = 0;\n}\n\n\nrot=transform.rotation;\nscl=transform.scale[0]\/100;\nw=(squareSize\/2)*scl;\nr=(degreesToRadians(rot))*2;\nt=transform.position;\n\n[t[0]+w*rot\/45,t[1]-(Math.abs((squareDiag+squareOffset)*Math.sin(r)))*scl];<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/youtu.be\/sVg8jnajLSk\">Based on Mikey Borup’s expression<\/a><\/p>\n<h2>Stepped Rotation<\/h2>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp_rotator_03_@loop.mp4#t=0.001\" width=\"1280\" height=\"670\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>An alternative to <f>time*n<\/f>. Instead of a smooth rotation, it creates a stepped movement. I usually use it to animate clock hands, gears or other similar mechanisms.<\/p>\n<p>Apply to the <f>Rotation<\/f>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">angle = 15; \/\/ Rotation angle per second\nrotateDuration = 10; \/\/ Duration of rotation in frames\n\nrotateDurationFr = rotateDuration\/(1\/thisComp.frameDuration);\n\nwholeSecond = Math.floor(time);\nstartAngle = wholeSecond * angle;\nease(time, wholeSecond, wholeSecond + rotateDurationFr, startAngle, startAngle + angle)<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/creativecow.net\/forums\/thread\/clock-second-hand-ticking\/\">© Xinlai Ni<\/a><\/p>\n<h2>Advanced Stepped Rotation<\/h2>\n<p>A more customizable version of the stepped rotation expression.<\/p>\n<p>Apply to the <f>Rotation<\/f>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">angle = 15; \/\/ Rotation angle per second\nrotateDuration = 6; \/\/ Duration of rotation in frames\ntimeStop = 5; \/\/ Stop duration between rotations\noffset = 0; \/\/ Offset of the initial frame \n\nfr = timeToFrames(time)+offset;\n\ncycle = timeStop+rotateDuration;\nn = Math.floor(fr\/cycle);\ncur_phase = fr-n*cycle;\n\nif((cur_phase)&gt;timeStop){\nangle*n+(cur_phase-timeStop)*angle\/rotateDuration;\n}\nelse{\nangle*n;\n}<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/aexpressions.ru\/expressions\/circular\/analogue-clock\/\">© aexpressions<\/a><\/p>\n<h2>Maintain Scale When Parented<\/h2>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp_maintain-scale_02_@loop.mp4#t=0.001\" width=\"1280\" height=\"670\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>When you parent one object to another and scale the parent, both layers will scale. This expression prevents the child layer from scaling and only moves it by position.<\/p>\n<p>Apply to the layer’s <f>Scale<\/f>, which should have a constant size:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">s = [];\nps = parent.transform.scale.value;\nfor (i = 0; i &lt; ps.length; i++){\ns[i] = value[i]*100\/ps[i];\n}\ns<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1a3ArTUHAJwVi-ObZofvz6IfrKbSGSENlaTIRTs8pAJU\/edit?pageId=116871612094468624414#gid=0\">© JR Canest<\/a><\/p>\n<h2>Checkbox Switcher<\/h2>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp_switcher_02_@loop.mp4#t=0.001\" width=\"1020\" height=\"490\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Toggle any value with a checkbox.<\/p>\n<p>Add a <f>Checkbox Control<\/f> to the layer with the expression.<br \/>\nApply this expression to a parameter you want to control:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">if (effect(&quot;Checkbox Control&quot;)(1) == 0) 0 else 100<\/code><\/pre><h2>Shape Layer Loop<\/h2>\n<p>Standard <f>loopOut()<\/f> doesn’t work with shape layers, but this expression does.<\/p>\n<p>Apply to the <f>Path<\/f> of the shape layer:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">try{\npingPong = false; \/\/ Set to true if pingPong is needed\n\ntimeStart = thisProperty.key(1).time;\nduration = thisProperty.key(thisProperty.numKeys).time-timeStart;\nquant=Math.floor((time-timeStart)\/duration);\n\nif(quant&lt;0) quant = 0\n\nif(quant%2 == 1 &amp;&amp; pingPong == true){\nt = 2*timeStart+ (quant+1)*duration - time;\n}\n\nelse{\nt = time-quant*duration;\n}\n}\ncatch(err){\nt = time;\n}\nthisProperty.valueAtTime(t)<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/aexpressions.ru\/expressions\/loop\/loopout-path-ping-pong\/\">© aexpressions<\/a><\/p>\n<h2>Range Mapper<\/h2>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp_range-mapper_03_@loop.mp4#t=0.001\" width=\"1150\" height=\"560\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Remap input values to a different output range.<\/p>\n<p>Add a <f>Slider Control<\/f> to a layer with expression and apply this to any parameter:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">input = effect(&quot;Slider Control&quot;)(&quot;Slider&quot;);\n\ninputLow = 0;\ninputHigh = 100;\noutputLow = 450;\noutputHigh = 650;\n\nlinear(input,inputLow,inputHigh,outputLow,outputHigh)<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/creativecow.net\/forums\/thread\/range-mapping-expression\/\">© Dan Ebberts<\/a><\/p>\n<h2>Maintain Stroke Width When Scaling<\/h2>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp_stroke-scale_02_@loop.mp4#t=0.001\" width=\"1280\" height=\"670\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Keep a constant stroke width when scaling a shape.<\/p>\n<p>Apply this to the <f>Stroke Width<\/f> of the shape layer:<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">value \/ length(toComp([0,0]), toComp([0.7071,0.7071])) || 0.001;<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/battleaxe.tumblr.com\/post\/101945073972\/maintain-stroke-weight-expression\">© Adam Plouff<\/a><\/p>\n<h2>Counters<\/h2>\n<p>A collection of 6 counter expressions for various use cases. All of these counters are basically text layers linked to slider controls, which can be keyframed.<\/p>\n<h3>1. Simple Counter<\/h3>\n<div class=\"quarter-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp-counter_simple_03_@loop.mp4#t=0.001\" width=\"700\" height=\"140\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Displays numbers with a fixed decimal place.<\/p>\n<p>Add a <f>Slider Control<\/f> to your text layer, it will control the counter. Apply expression to the <f>Source Text<\/f>. Change the number of decimal places by adjusting the <f>toFixed(2)<\/f> parameter.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">parseFloat(effect(&quot;Slider Control&quot;)(&quot;Slider&quot;)).toFixed(2)<\/code><\/pre><h3>2. Comma Separator Counter<\/h3>\n<div class=\"quarter-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp-counter_comma_03_@loop.mp4#t=0.001\" width=\"700\" height=\"140\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Replaces the decimal point with a comma. If you happen to need a similar setup with more customization, it’s <a href=\"http:\/\/keyframed.tv\/how-to-format-a-slider-control-value-as-money-in-after-effects\/\">right here<\/a>.<\/p>\n<p>Add a <f>Slider Control<\/f> and apply expression to the <f>Source Text<\/f>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">c = parseFloat(effect(&quot;Slider Control&quot;)(&quot;Slider&quot;)).toFixed(2);\nc.toString().replace(&quot;.&quot;, &quot;,&quot;)<\/code><\/pre><h3>3. Counter with Additional Symbols<\/h3>\n<div class=\"quarter-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp-counter_symbols_03_@loop.mp4#t=0.001\" width=\"700\" height=\"140\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Adds symbols like <f>+<\/f> or <f>%<\/f> to the number.<\/p>\n<p>Add a <f>Slider Control<\/f> and apply expression to the <f>Source Text<\/f>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">&quot;+&quot;+parseFloat(effect(&quot;Slider Control&quot;)(&quot;Slider&quot;)).toFixed(2)+&quot;%&quot;<\/code><\/pre><h3>4. Counter with Leading Zeros<\/h3>\n<div class=\"quarter-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp-counter_zeros_03_@loop.mp4#t=0.001\" width=\"700\" height=\"140\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Displays numbers like <f>001<\/f> instead of <f>1<\/f>.<\/p>\n<p>Add a <f>Slider Control<\/f> and apply expression to the <f>Source Text<\/f>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">zerosAmount = 3;\n\nvar slider = effect(&quot;Slider Control&quot;)(&quot;Slider&quot;);\n\nfunction padStart(string, targetLength, character) {\n\tstring = (string instanceof String) ? string : string.toString();\n\ttargetLength = targetLength &gt;&gt; 0;\n\tcharacter = character || ' ';\n\n\twhile (string.length &lt; targetLength) {\n\t\tstring = character + string;\n\t}\n\nreturn string;\n};\n\nif (slider &gt;= 0) {\nzeroAmount = zerosAmount + 1;\npaddedString = padStart(parseFloat(slider.value).toFixed(0), zerosAmount, '0');\n}\n\nelse {\npaddedString = '-0'+padStart(parseFloat(slider.value).toFixed(0)*-1, zerosAmount, '0');\n}\n\npaddedString;<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/community.adobe.com\/t5\/after-effects\/how-to-create-a-counting-number-but-starting-with-zeros\/td-p\/10632356\">Based on Tomas Sinkunas’ expression<\/a><\/p>\n<h3>5. Digit Grouping Counter<\/h3>\n<div class=\"quarter-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp-counter_grouping_03_@loop.mp4#t=0.001\" width=\"700\" height=\"140\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>Adds spacing to group digits, turning <f>30000<\/f> into <f>30 000<\/f>.<\/p>\n<p>Add a <f>Slider Control<\/f> and apply expression to the <f>Source Text<\/f>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">num = parseFloat(effect(&quot;Slider Control&quot;)(&quot;Slider&quot;)).toFixed(0);\nstr = isNaN(num) ? &quot;&quot; : (num * 1 + &quot;&quot;);\nstr.replace(\/(\\d)(?=(\\d\\d\\d)+([^\\d]|$))\/g, '$1 ');<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/creativecow.net\/forums\/thread\/number-expression-with-decimals\/\">© Tomas Bumbulevičius<\/a><\/p>\n<h3>6. Large Number Counter:<\/h3>\n<div class=\"quarter-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp-counter_large_03_@loop.mp4#t=0.001\" width=\"700\" height=\"140\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>For values above 1,000,000, use <f>Angle Control<\/f> instead of a <f>Slider Control<\/f>.<\/p>\n<p>Add an <f>Angle Control<\/f> and apply expression to the <f>Source Text<\/f>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">number = Math.round(effect(&quot;Angle Control&quot;)(&quot;Angle&quot;)\/360);\n\nn=&quot;&quot; + number;\ns=&quot;&quot;;\nfor(i=0, l=n.length; i&amp;#60;l;  i++){\n    if(s &amp;&amp; s!=&quot;-&quot; &amp;&amp; (l-i)%3 ==0)\n                s+=&quot; &quot;; \n        s += n[i];\n}\ns;<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/chunkmotion.design\/resources\/after-effects-expressions\/\">© Chunk Motion<\/a><\/p>\n<h2>Various Mini Expressions<\/h2>\n<p>And finally, 4 useful mini-expressions that often come in handy.<\/p>\n<h3>1. Link to Layer Above or Below<\/h3>\n<div class=\"half-video\"><div class=\"e2-text-video\">\n<video src=\"https:\/\/balyberdin.com\/library\/video\/en_exp-index-1_02_@loop.mp4#t=0.001\" width=\"900\" height=\"560\" autoplay muted loop playsinline alt=\"\" \/>\n\n<\/div>\n<\/div><p>It’s not a complete expression, but only part of it. Instead of linking one layer to another using its name, it is sometimes more convenient to link to a layer above or below the layer with the expression.<\/p>\n<p>In the example, I link the box’s layer position to any layer above. To parent to a layer below instead, use <f>index+1<\/f>.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">thisComp.layer(index-1)<\/code><\/pre><h3>2. Constantly Accelerating Rotation<\/h3>\n<p>Add this to <f>Rotation<\/f> for progressively faster spins:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">time*time*time*time<\/code><\/pre><h3>3. Keyframes with <f>time*n<\/f><\/h3>\n<p>Add constant motion while still allowing keyframes.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">value+time*11<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/youtu.be\/rsW4fwscwKI?t=193\">© Ben Marriott<\/a><\/p>\n<h3>4. Link Gradient Ramp to Layer<\/h3>\n<p>Prevent a gradient ramp from shifting when moving the layer. Apply to the <f>Start<\/f> and <f>End<\/f> of the gradient.<\/p>\n<pre class=\"e2-text-code\"><code class=\"javascript\">toComp(value)<\/code><\/pre><p class=\"foot\"><a href=\"https:\/\/aexpressions.ru\/expressions\/misc\/link-ramp-to-layer\/\">© aeexpressions<\/a><\/p>\n<p><br><\/p>\n<p>That’s it! This collection includes 23 expressions I use regularly.<br \/>\n<a href=\"https:\/\/balyberdin.gumroad.com\/l\/ae-expressions\">📁 The project file<\/a> with all of them is available for free.<\/p>\n",
            "date_published": "2024-11-24T17:44:02+02:00",
            "date_modified": "2025-09-20T16:28:30+02:00",
            "tags": [
                "after effects",
                "expressions"
            ],
            "_date_published_rfc2822": "Sun, 24 Nov 2024 17:44:02 +0200",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "4",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}