Pure SVG animations with no CSS requiredNEW
SMIL (Synchronized Multimedia Integration Language) is a W3C standard for creating animations directly in SVG files using declarative XML tags. Unlike CSS animations, SMIL is completely self-contained within the SVG file.
<img> tags - unlike inline SVG with CSSThe SMIL variant works exactly like a regular image - no external files needed:
<!-- Simple: Just use the SMIL SVG -->
<img src="telemetryos-logo-smil.svg" alt="TelemetryOS" style="width: 200px;" />
<!-- Or with object tag -->
<object data="telemetryos-logo-smil.svg" type="image/svg+xml" style="width: 200px;"></object>
<svg viewBox="0 0 295 291.62" xmlns="http://www.w3.org/2000/svg">
<!-- Main T vertical stroke with top bar -->
<g transform-origin="147.5 145.81">
<!-- Scale animation -->
<animateTransform
attributeName="transform"
attributeType="XML"
type="scale"
values="1; 1.15; 0.95; 1; 1"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
repeatCount="indefinite"
additive="sum"
calcMode="spline"
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1"
/>
<!-- Opacity animation -->
<animate
attributeName="opacity"
values="0.75; 1; 0.85; 0.75; 0.75"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
repeatCount="indefinite"
calcMode="spline"
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1"
/>
<path
d="M245.1,107.09l6.77-25.27c1.05-3.92-1.9-7.77-5.96-7.77H112.48c-4.19,0-7.86,2.82-8.95,6.86l-6.77,25.27c-1.05,3.92,1.9,7.77,5.96,7.77h37.54c4.06,0,7.01,3.85,5.96,7.77l-23.6,88.07c-1.05,3.92,1.9,7.77,5.96,7.77h26.16c4.19,0,7.86-2.82,8.95-6.86l24.09-89.89c1.08-4.05,4.75-6.86,8.95-6.86h39.42c4.19,0,7.86-2.82,8.95-6.86Z"
fill="#f7b434"
/>
</g>
<!-- Top left dot -->
<g transform-origin="56.09 88.395">
<!-- Translate animation -->
<animateTransform
attributeName="transform"
attributeType="XML"
type="translate"
values="0,0; 0,-8; 0,3; 0,0; 0,0"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
begin="0.25s"
repeatCount="indefinite"
additive="sum"
calcMode="spline"
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1"
/>
<!-- Scale animation -->
<animateTransform
attributeName="transform"
attributeType="XML"
type="scale"
values="1; 1.25; 0.9; 1; 1"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
begin="0.25s"
repeatCount="indefinite"
additive="sum"
calcMode="spline"
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1"
/>
<!-- Opacity animation -->
<animate
attributeName="opacity"
values="0.7; 1; 0.8; 0.7; 0.7"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
begin="0.25s"
repeatCount="indefinite"
calcMode="spline"
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1"
/>
<path
d="M84.19,107.09l6.77-25.27c1.05-3.92-1.9-7.77-5.96-7.77h-26.16c-4.19,0-7.86,2.82-8.95,6.86l-6.77,25.27c-1.05,3.92,1.9,7.77,5.96,7.77h26.16c4.19,0,7.86-2.82,8.95-6.86Z"
fill="#f7b434"
/>
</g>
<!-- Bottom left dot -->
<g transform-origin="103.79 144.895">
<!-- Translate animation -->
<animateTransform
attributeName="transform"
attributeType="XML"
type="translate"
values="0,0; 0,-8; 0,3; 0,0; 0,0"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
begin="0.5s"
repeatCount="indefinite"
additive="sum"
calcMode="spline"
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1"
/>
<!-- Scale animation -->
<animateTransform
attributeName="transform"
attributeType="XML"
type="scale"
values="1; 1.25; 0.9; 1; 1"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
begin="0.5s"
repeatCount="indefinite"
additive="sum"
calcMode="spline"
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1"
/>
<!-- Opacity animation -->
<animate
attributeName="opacity"
values="0.7; 1; 0.8; 0.7; 0.7"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
begin="0.5s"
repeatCount="indefinite"
calcMode="spline"
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1; 0.42 0 0.58 1"
/>
<path
d="M124.75,125.86h-26.16c-4.19,0-7.86,2.82-8.95,6.86l-6.77,25.27c-1.05,3.92,1.9,7.77,5.96,7.77h26.16c4.19,0,7.86-2.82,8.95-6.86l6.77-25.27c1.05-3.92-1.9-7.77-5.96-7.77Z"
fill="#f7b434"
/>
</g>
</svg>
SMIL animations scale perfectly to any size:
Both approaches create the same visual result, but with different technical implementations:
<animate> and <animateTransform> tags<img> tags@keyframes in <style> block<img> tags (when inline)Which to choose? Both are excellent options. Choose SMIL if you prefer declarative XML syntax, or CSS if you're more comfortable with keyframe animations. Both produce identical visual results.
The SMIL implementation uses these animation tags:
<animateTransform type="scale"> - Scales elements smoothly<animateTransform type="translate"> - Moves elements up and down<animate attributeName="opacity"> - Fades elements in and outadditive="sum" - Allows multiple transforms to combinerepeatCount="indefinite" - Loops animations continuouslyAnimation timing:
Here's how the SMIL animations are structured:
<g transform-origin="147.5 145.81">
<!-- Scale animation -->
<animateTransform
attributeName="transform"
type="scale"
values="1; 1.15; 0.95; 1; 1"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
repeatCount="indefinite"
additive="sum"
/>
<!-- Opacity animation -->
<animate
attributeName="opacity"
values="0.75; 1; 0.85; 0.75; 0.75"
keyTimes="0; 0.15; 0.3; 0.45; 1"
dur="2s"
repeatCount="indefinite"
/>
<path d="..." fill="#f7b434" />
</g>
<img> tag usageWhen to use alternatives:
TelemetryOSLoader.jsx componenttelemetryos-logo-smil.svg - That's it! Everything is included.<!-- Copy the SMIL SVG file to your project -->
<!-- Use it like any image -->
<img src="telemetryos-logo-smil.svg" alt="TelemetryOS" style="width: 200px;" />