{ "@context": "https://schema.org", "@graph": [ { "@type": "SoftwareApplication", "@id": "https://movesloma.com/#app", "name": "Sloma", "url": "https://movesloma.com/", "applicationCategory": "HealthApplication", "applicationSubCategory": "Lymphatic movement routine", "operatingSystem": "iOS", "description": "A daily guided lymphatic movement routine for iPhone. Nine gentle movements, about eight minutes, most days. No reps, no accounts, no ads.", "offers": { "@type": "Offer", "price": "2.99", "priceCurrency": "USD", "category": "one-time purchase" }, "author": { "@type": "Person", "name": "Joshua Seff" }, "installUrl": "https://apps.apple.com/app/idTODO_APP_ID" }, { "@type": "FAQPage", "@id": "https://movesloma.com/#faq", "mainEntity": [ { "@type": "Question", "name": "What is Sloma?", "acceptedAnswer": { "@type": "Answer", "text": "Sloma is an iPhone app: a daily guided movement routine. Nine gentle movements, about eight minutes, in the same calm order every day. You press start and follow along - no reps to count and no intensity to push through." } }, { "@type": "Question", "name": "What is a lymphatic movement routine?", "acceptedAnswer": { "@type": "Answer", "text": "It's a category name for gentle, rhythmic, whole-body movement - light bouncing, swinging, shaking and twisting. Sloma uses the term to describe the style of movement, not to promise any medical result."} }, { "@type": "Question", "name": "How long does the routine take?", "acceptedAnswer": { "@type": "Answer", "text": "About eight minutes. Nine movements, most of them 45 to 60 seconds, in the same order each day." } }, { "@type": "Question", "name": "How much does Sloma cost? Is there a subscription?", "acceptedAnswer": { "@type": "Answer", "text": "Sloma is a one-time purchase of $2.99. There is no subscription and there are no in-app purchases. You buy it once and it's yours." } }, { "@type": "Question", "name": "Does Sloma show ads or track me?", "acceptedAnswer": { "@type": "Answer", "text": "No. There are no ads, no analytics, and no tracking. Everything you do stays on your device - Sloma has no account and makes no network requests." } }, { "@type": "Question", "name": "Do I need an account to use Sloma?", "acceptedAnswer": { "@type": "Answer", "text": "No account and no login. You open the app and move. Nothing is uploaded and nothing signs you in." } }, { "@type": "Question", "name": "What devices does Sloma work on?", "acceptedAnswer": { "@type": "Answer", "text": "Sloma is an iPhone app. It works fully offline once installed." } }, { "@type": "Question", "name": "Do I need any equipment or experience?", "acceptedAnswer": { "@type": "Answer", "text": "No equipment and no experience. The movements are gentle and low-impact, done standing in a small space, and each one is shown with a calm animation and a plain one-line description." } }, { "@type": "Question", "name": "How does the streak and avatar work?", "acceptedAnswer": { "@type": "Answer", "text": "You pick how many days a week you want to move - three, four, or five. Sloma counts days, not workouts, so doing it twice in a day doesn't count twice. Stay consistent and an avatar slowly transforms from rough Rock all the way to Fire. Going up is slow; a rough week only ever costs one level." } } ] } ] }
waiting… (if this text never changes, scripts are not running)
(function(){ var box = document.getElementById('sloma-diag'); var other = document.getElementById('moves'); // an element from embed-1 box.textContent = 'script RAN ✓ | can see the Main content embed: ' + (other ? 'YES ✓' : 'NO ✗'); box.style.borderColor = '#2a7'; })();
Sloma

Daily lymphatic movement

Move a little,
most days.

Nine gentle movements. About eight minutes. Same calm order every day. You press start and follow along.

Coming soon to the
App Store
$2.99 once · iPhone · in review
Body waves
Pay once — no subscription No ads, no tracking No account, no login Works fully offline Yours forever

The nine movements

Not a figure to copy — the trail a movement leaves.

Each movement is drawn as an abstract glyph: a soft ribbon along its path, a glowing head travelling it, and ripples that bloom where the motion lands. One calm visual language, nine gentle movements.

How it works

Consistency, not intensity.

Sloma asks something small and asks it often. The whole design forgives a rough week and rewards the long habit.

Press start

Follow along, about eight minutes

Nine movements in the same order every day — light bouncing, loose swinging, easy shaking and twisting. No reps to count, no intensity to push through.

Show up

It counts days, not workouts

Pick three, four, or five days a week. Sloma tracks the weeks, not the sessions — doing it twice in a day doesn't count twice. Showing up on more days does.

Keep going

Watch it slowly add up

Stay consistent and your avatar transforms. Two good weeks move you up a level; one rough week only ever costs you one. Going up is slow — that's the point.

From rough Rock through Clay, Mud, Jello, Honey, Water, Mercury, Lava and Orb, all the way to Fire. It takes months of steady weeks to climb — almost nobody reaches Fire, and that's intended. The reward is for the habit, not any single session.

Built to respect you

The opposite of a wellness subscription.

No monthly bill, nothing to cancel, nothing watching you. You buy Sloma once and it quietly does its one job.

Pay once, keep it

A single $2.99 purchase. No subscription, no in-app purchases, no upsells. It's yours.

No ads, ever

Nothing to sell you mid-routine. The app opens, you move, you close it.

Nothing leaves your phone

No analytics, no tracking, no network requests. Everything you do stays on your device.

No account to make

No login, no email, no password. Open the app and start.

A small daily practice

Made to disappear
into your routine.

Move a little, most days. Watch it add up.

Coming soon to the
App Store
$2.99 once · no subscription
(function(){ "use strict"; var VIEWBOX = 200, TAU = Math.PI*2, SAMPLES = 120; function bnf(t){ var x = t<0.5 ? t*2 : 2-2*t; return x*x*(3-2*x); } function qbez(e,a,b,c){ var m=1-e; return { x:m*m*a.x+2*m*e*b.x+e*e*c.x, y:m*m*a.y+2*m*e*b.y+e*e*c.y }; } function p(x,y){ return {x:x,y:y}; } var SPECS = { "lymphatic-hops": { loopMs:950, heads:[ { pos:function(t){ var u=Math.pow(Math.sin(t*Math.PI),0.6); return p(100+4*Math.sin(t*TAU),130-38*u); }, rings:[0] } ] }, "body-waves": { loopMs:2400, heads:[ { pos:function(t){ return qbez(bnf(t),p(50,156),p(132,128),p(150,48)); }, rings:[0,0.5] } ] }, "arm-swings": { loopMs:2100, heads:[ { pos:function(t){ return qbez(bnf(t),p(108,50),p(100,100),p(150,148)); }, rings:[0,0.5] }, { pos:function(t){ return qbez(1-bnf(t),p(92,50),p(100,100),p(50,148)); }, rings:[0,0.5] } ] }, "dead-arms": { loopMs:2500, heads:[ { pos:function(t){ return p(100+50*Math.sin(TAU*t),116+20*Math.sin(2*TAU*t)); }, rings:[0.25,0.75] } ] }, "trunk-twists": { loopMs:2300, heads:[ { pos:function(t){ var d=2*bnf(t)-1; return p(100+72*d,98+11*Math.abs(d)); }, rings:[0,0.5] } ] }, "golf-swings": { loopMs:2500, heads:[ { pos:function(t){ return qbez(bnf(t),p(42,72),p(100,186),p(158,72)); }, rings:[0,0.5] } ] }, "march-slaps": { loopMs:1600, heads:[ { pos:function(t){ return p(70,128-46*(0.5-0.5*Math.cos(TAU*t))); }, rings:[0] }, { pos:function(t){ return p(130,128-46*(0.5-0.5*Math.cos(TAU*(t+0.5)))); }, rings:[0.5] } ] }, "windmill": { loopMs:2600, bar:true, band:[ [p(60,80),p(140,134)], [p(140,80),p(60,134)] ], heads:[ { pos:function(t){ var th=((36+108*(0.5-0.5*Math.cos(TAU*t)))*Math.PI)/180; return p(100+49*Math.cos(th),107+49*Math.sin(th)); }, rings:[0,0.5] }, { pos:function(t){ var th=((36+108*(0.5-0.5*Math.cos(TAU*t)))*Math.PI)/180; return p(100-49*Math.cos(th),107-49*Math.sin(th)); }, rings:[0,0.5] } ] }, "ballerina": { loopMs:3000, heads:[ { pos:function(t){ return qbez(bnf(t),p(108,150),p(150,120),p(150,52)); }, rings:[0,0.5] }, { pos:function(t){ return qbez(bnf(t),p(92,150),p(50,120),p(50,52)); }, rings:[0,0.5] } ] } }; var round = function(n){ return Math.round(n*10)/10; }; function polylineD(pts){ return pts.map(function(pt,i){ return (i?"L":"M")+round(pt.x)+" "+round(pt.y); }).join(" "); } function buildGlyph(key){ var spec = SPECS[key]; var heads = spec.heads.map(function(h){ var xs=[], ys=[]; for(var i=0;i<=SAMPLES;i++){ var pt=h.pos(i/SAMPLES); xs.push(pt.x); ys.push(pt.y); } return { xs:xs, ys:ys, rings:h.rings, oneWay:!!h.oneWay }; }); var bandPolys = spec.band ? spec.band : spec.heads.map(function(h){ var pts=[]; for(var i=0;i<=SAMPLES;i++) pts.push(h.pos(i/SAMPLES)); return pts; }); var bandDs = bandPolys.map(polylineD); var ringAnchors = []; spec.heads.forEach(function(h){ h.rings.forEach(function(phase){ var pt=h.pos(phase); ringAnchors.push({x:pt.x,y:pt.y,phase:phase}); }); }); return { loopMs:spec.loopMs, bandDs:bandDs, heads:heads, ringAnchors:ringAnchors, bar:!!spec.bar }; } function circDist(a,b){ var d=Math.abs(a-b)%1; return Math.min(d,1-d); } function sampleHead(xs,ys,t){ var n=xs.length-1, f=t*n, i=Math.min(n,Math.floor(f)), j=i>=n?n:i+1, frac=f-i; return { x:xs[i]+(xs[j]-xs[i])*frac, y:ys[i]+(ys[j]-ys[i])*frac }; } function frameAt(glyph,t){ var life = Math.min(1650, glyph.loopMs*0.92); var heads = glyph.heads.map(function(h){ var pt=sampleHead(h.xs,h.ys,t), md=1; for(var r=0;r=life) return { cx:a.x, cy:a.y, r:3, opacity:0 }; var k=age/life; return { cx:a.x, cy:a.y, r:3+22*k, opacity:0.5*(1-k)*(1-k) }; }); var bar=null; if(glyph.bar && glyph.heads.length>=2){ var pa=sampleHead(glyph.heads[0].xs,glyph.heads[0].ys,t); var pb=sampleHead(glyph.heads[1].xs,glyph.heads[1].ys,t); bar={ x1:pa.x, y1:pa.y, x2:pb.x, y2:pb.y }; } return { heads:heads, rings:rings, bar:bar }; } var SVGNS="http://www.w3.org/2000/svg"; var gidSeq=0; var instances=[]; function el(name,attrs){ var e=document.createElementNS(SVGNS,name); if(attrs) for(var k in attrs) e.setAttribute(k,attrs[k]); return e; } function mount(container,key){ var glyph=buildGlyph(key); container.textContent=""; var svg=el("svg",{viewBox:"-16 -16 232 232",width:"100%",height:"100%"}); svg.setAttribute("class","glyph-svg"); var gid="g"+(gidSeq++); var defs=el("defs"); var grad=el("radialGradient",{id:gid,cx:"50%",cy:"50%",r:"50%"}); var s0=el("stop",{offset:"0%","stop-opacity":"1"}); s0.setAttribute("class","gs0"); var s1=el("stop",{offset:"50%","stop-opacity":"0.95"}); s1.setAttribute("class","gs1"); var s2=el("stop",{offset:"100%","stop-opacity":"0"}); s2.setAttribute("class","gs2"); grad.appendChild(s0); grad.appendChild(s1); grad.appendChild(s2); defs.appendChild(grad); svg.appendChild(defs); glyph.bandDs.forEach(function(d){ var wide=el("path",{d:d,fill:"none","stroke-width":"13","stroke-linecap":"round","stroke-linejoin":"round"}); wide.setAttribute("class","ribbon-wide"); svg.appendChild(wide); }); glyph.bandDs.forEach(function(d){ var thin=el("path",{d:d,fill:"none","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"}); thin.setAttribute("class","ribbon-thin"); svg.appendChild(thin); }); var rippleEls = glyph.ringAnchors.map(function(){ var c=el("circle",{fill:"none","stroke-width":"1.8"}); c.setAttribute("class","ripple"); svg.appendChild(c); return c; }); var barEl=null; if(glyph.bar){ barEl=el("line",{"stroke-width":"3.5","stroke-linecap":"round"}); barEl.setAttribute("class","bar"); svg.appendChild(barEl); } var headEls = glyph.heads.map(function(){ var c=el("circle",{fill:"url(#"+gid+")"}); svg.appendChild(c); return c; }); container.appendChild(svg); var inst={ glyph:glyph, rippleEls:rippleEls, headEls:headEls, barEl:barEl }; render(inst, prefersReduced ? 0.2 : 0); return inst; } function render(inst,t){ var f=frameAt(inst.glyph,t); f.heads.forEach(function(h,i){ var c=inst.headEls[i]; c.setAttribute("cx",round(h.cx)); c.setAttribute("cy",round(h.cy)); c.setAttribute("r",round(h.r)); c.setAttribute("opacity",h.opacity.toFixed(3)); }); f.rings.forEach(function(r,i){ var c=inst.rippleEls[i]; c.setAttribute("cx",round(r.cx)); c.setAttribute("cy",round(r.cy)); c.setAttribute("r",round(r.r)); c.setAttribute("opacity",r.opacity.toFixed(3)); }); if(inst.barEl && f.bar){ inst.barEl.setAttribute("x1",round(f.bar.x1)); inst.barEl.setAttribute("y1",round(f.bar.y1)); inst.barEl.setAttribute("x2",round(f.bar.x2)); inst.barEl.setAttribute("y2",round(f.bar.y2)); } } var prefersReduced = window.matchMedia && window.matchMedia("(prefers-reduced-motion:reduce)").matches; var MOVES = [ ["lymphatic-hops","Lymphatic hops","Bounce gently on the balls of your feet, heels lifting and dropping in a light, springy rhythm."], ["body-waves","Body waves","Swing both arms up overhead and back down in a big, rolling wave — like doing the wave at a stadium."], ["arm-swings","Arm swings","An easy front-to-back pendulum, one arm reaching forward and up as the other swings behind you."], ["dead-arms","Dead arms","Let your arms hang completely limp, twisting side to side so they whip and wrap loosely around you."], ["trunk-twists","Trunk twists","Hands crossed on your chest, twist your upper body smoothly from side to side."], ["golf-swings","Golf swings","Hands loosely clasped, sweep your arms low across your body from side to side."], ["march-slaps","March slaps","March in place, lifting each knee to hip height and tapping it with your opposite hand."], ["windmill","Windmill","Reach one hand down toward the opposite foot as the other sweeps up to the sky, alternating."], ["ballerina","Ballerina","Swing your arms up out to the sides as you bend into a small squat, then smoothly reverse."] ]; var LADDER = [ ["Rock","#8B8680","Jagged, motionless",14], ["Clay","#A08868","Softens, stays",15], ["Mud","#AC8F72","No edges left",16], ["Jello","#8FB4A4","First life, wobbles",17], ["Honey","#E8B655","Thick, glossy",18], ["Water","#5B96A8","Flows freely",19], ["Mercury","#767C82","Beads, mirror-bright",20], ["Lava","#FF7A3D","Molten, its own heat",22], ["Orb","#E8D9A8","Coherent light",24], ["Fire","#FF6B35","Pure upward energy",27] ]; function init(){ var heroBox=document.getElementById("hero-glyph"); var heroCap=document.getElementById("hero-cap"); var grid=document.getElementById("moves"); var lad=document.getElementById("ladder"); if(!heroBox||!heroCap||!grid||!lad){ return setTimeout(init,60); } if(heroBox.getAttribute("data-mounted")) return; heroBox.setAttribute("data-mounted","1"); var heroInst=mount(heroBox, MOVES[1][0]); var heroIdx=1; var grid=document.getElementById("moves"); var moveInsts=[]; MOVES.forEach(function(m,i){ var card=document.createElement("div"); card.className="move"; var g=document.createElement("div"); g.className="glyph"; card.appendChild(g); var idx=document.createElement("div"); idx.className="idx"; idx.textContent="0"+(i+1); card.appendChild(idx); var h=document.createElement("h3"); h.textContent=m[1]; card.appendChild(h); var pEl=document.createElement("p"); pEl.textContent=m[2]; card.appendChild(pEl); grid.appendChild(card); moveInsts.push(mount(g,m[0])); }); var lad=document.getElementById("ladder"); LADDER.forEach(function(r){ var rung=document.createElement("div"); rung.className="rung"; var bead=document.createElement("div"); bead.className="bead"; bead.style.width=r[3]+"px"; bead.style.height=r[3]+"px"; bead.style.background="radial-gradient(circle at 35% 30%, #ffffffcc, "+r[1]+" 62%)"; rung.appendChild(bead); var nm=document.createElement("div"); nm.className="rname"; nm.textContent=r[0]; rung.appendChild(nm); var cue=document.createElement("div"); cue.className="rcue"; cue.textContent=r[2]; rung.appendChild(cue); lad.appendChild(rung); }); if(prefersReduced){ return; } setInterval(function(){ heroIdx=(heroIdx+1)%MOVES.length; heroCap.style.opacity="0"; setTimeout(function(){ heroInst=mount(heroBox, MOVES[heroIdx][0]); heroCap.textContent=MOVES[heroIdx][1]; heroCap.style.opacity="1"; },420); },4600); var last=0, FRAME=33; function tick(now){ requestAnimationFrame(tick); if(now-last

Questions

Good to know before you start.

What is Sloma?

Sloma is an iPhone app: a daily guided movement routine. Nine gentle movements, about eight minutes, in the same calm order every day. You press start and follow along — no reps to count and no intensity to push through.

What is a lymphatic movement routine?

It’s a category name for gentle, rhythmic, whole-body movement — light bouncing, swinging, shaking and twisting. Sloma uses the term to describe the style of movement, not to promise any medical result.

How long does the routine take?

About eight minutes. Nine movements, most of them 45 to 60 seconds, in the same order each day.

How much does Sloma cost? Is there a subscription?

Sloma is a one-time purchase of $2.99. There is no subscription and there are no in-app purchases. You buy it once and it’s yours.

Does Sloma show ads or track me?

No. There are no ads, no analytics, and no tracking. Everything you do stays on your device — Sloma has no account and makes no network requests.

Do I need an account to use Sloma?

No account and no login. You open the app and move. Nothing is uploaded and nothing signs you in.

What devices does Sloma work on?

Sloma is an iPhone app. It works fully offline once installed.

Do I need any equipment or experience?

No equipment and no experience. The movements are gentle and low-impact, done standing in a small space, and each one is shown with a calm animation and a plain one-line description.

How does the streak and avatar work?

You pick how many days a week you want to move — three, four, or five. Sloma counts days, not workouts, so doing it twice in a day doesn’t count twice. Stay consistent and an avatar slowly transforms from rough Rock all the way to Fire. Going up is slow; a rough week only ever costs one level.

Snugl Privacy Policy

Last updated: August 2026

Snugl is a coordination app for new parents to keep track of overnight baby care — feeds, pumps, diaper changes, and upright holds — and to share that live status with a partner. We built Snugl to be private by default. This policy explains what we collect (very little), why, and what we never do.

The short version

  • No sign-up. No name, email, phone number, or contacts required or collected.
  • Single-parent use stays entirely on your device.
  • No ads. No tracking. We never sell or share your data.
  • Recent activity is kept for about a week, then automatically deleted.

What we collect

Only what's needed for the app to work:

  • Baby-care log entries you create — the type of event (feed, pump, diaper, upright), timing, and small details like side or ounces. These describe care activity, not a person.
  • An anonymous identifier used to connect two paired devices to the same shared family. It is a random ID, not tied to your real-world identity, email, or Apple Account.
  • Purchase status for the one-time "Partner Sync" unlock, so the app knows whether the feature is active. Payments are handled by Apple; we never see your card or billing details.

We do not collect your name, email address, phone number, contacts, precise location, photos, browsing history, or advertising identifiers.

How your data is stored

  • Single-parent mode: everything stays on your device. Nothing is sent to a server.
  • Paired mode: to sync between two phones, your log entries and the anonymous family ID are stored in our secure backend (hosted on Supabase) and shared only with the device that joined your family using your 6-digit code.

Service providers

We use a small number of providers strictly to run the app:

  • Supabase — secure database and real-time sync for paired families.
  • RevenueCat & Apple — to process and verify the one-time in-app purchase.
  • Apple — to deliver Lock Screen Live Activities and local notifications on your device.

These providers process data only to provide their service to Snugl and are not permitted to use it for their own purposes.

Data retention

Snugl is about the recent picture, not a permanent record. Detailed log entries are automatically removed after roughly a week, on your device and in the paired backend alike. You can also erase all local data at any time from Settings → "Reset app," and you can unpair from a partner to stop sharing.

Children's privacy

Snugl is intended for use by parents and guardians. Any information about an infant is entered by the adult using the app for their own coordination. Snugl is not directed to children under 13, and we do not knowingly collect personal information from children.

Security

Data in the paired backend is protected by row-level security so that only members of your family — devices that joined with your code — can read it. Data in transit is encrypted.

Your choices

  • Use Snugl entirely offline in single-parent mode.
  • Reset all local data from Settings at any time.
  • Unpair to stop sharing with a partner.

Changes to this policy

If we update this policy, we'll revise the date above. Material changes will be reflected in the app or on this page.

Contact

Questions about privacy? Email us at [email protected].