From a8780d52368f36fff46d3679ee43c45aebeadcc6 Mon Sep 17 00:00:00 2001 From: SkateSpots Date: Fri, 30 Oct 2026 22:33:53 +0700 Subject: [PATCH] dist: self-hosted Forgejo release page and F-Droid metadata --- distribution/README.md | 74 +++++++++++ .../fdroiddata/org.skatespots.app.yml | 51 ++++++++ .../android/en-US/changelogs/10761.txt | 1 + .../android/en-US/full_description.txt | 15 +++ .../metadata/android/en-US/images/icon.png | Bin 0 -> 26231 bytes .../android/en-US/short_description.txt | 1 + fastlane/metadata/android/en-US/title.txt | 1 + public/download/index.html | 121 ++++++++++++++++++ 8 files changed, 264 insertions(+) create mode 100644 distribution/README.md create mode 100644 distribution/fdroiddata/org.skatespots.app.yml create mode 100644 fastlane/metadata/android/en-US/changelogs/10761.txt create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/images/icon.png create mode 100644 fastlane/metadata/android/en-US/short_description.txt create mode 100644 fastlane/metadata/android/en-US/title.txt create mode 100644 public/download/index.html diff --git a/distribution/README.md b/distribution/README.md new file mode 100644 index 0000000..9b05ae7 --- /dev/null +++ b/distribution/README.md @@ -0,0 +1,74 @@ +# Distribution without GitHub + +SkateSpots is published from a self-hosted **Forgejo** instance. No GitHub +account is required. + +## Current release source + +- Forge: +- Latest release: +- Signed APK (1.7.61): + +- SHA-256: + `db0279f759efd9fa05d9d1bed57a3f5856777e6ccb208d3ed78b15398f266fba` + +The APK is signed with the same key as the Zapstore build. Installing an +F-Droid-signed build over it would require uninstalling SkateSpots and losing +the local key/settings. Obtanium and direct APK updates keep the install. + +## Obtanium + +Obtanium cannot use a Zapstore URL as a source. Use the self-hosted Forgejo +release page instead: + +1. Open Obtanium → **Add App**. +2. Paste: + `https://git.skate-spots.org/skatespots/SkateSpots/releases/latest` +3. If Obtanium does not recognise the self-hosted host, select **Override + Source → HTML**. +4. Set version extraction if desired: + `SkateSpots-([0-9.]+)\.apk`, match group `1`. + +The release page contains exactly one `.apk`, so Obtanium can follow the latest +release without a custom store listing. + +## F-Droid and IzzyOnDroid + +- Source: `https://git.skate-spots.org/skatespots/SkateSpots.git` +- Recipe draft: `distribution/fdroiddata/org.skatespots.app.yml` +- Store metadata: `fastlane/metadata/android/en-US/` + +### IzzyOnDroid first + +IzzyOnDroid accepts reproducible third-party builds and is the least risky step +before F-Droid main. Submit the public source URL and the signed release. Keep +the developer signature for the Obtanium/APK channel; do not replace the +existing install with an F-Droid-signed build without telling users. + +### F-Droid main + +F-Droid main requires: + +- a public, clonable source repository (the Forgejo URL above); +- a working `fdroiddata` recipe including the generated Android project step; +- a reproducible build or an accepted build recipe; +- maintainer review and F-Droid's own signing key. + +The recipe is a draft, not an accepted F-Droid build. The Android project is +generated by Capacitor and intentionally not committed, so the prebuild steps +must be verified in the F-Droid build environment before submitting. + +## Release checklist + +1. `npm test` +2. `scripts/release.sh patch --yes --deploy` (Zapstore + web) +3. Push the release tag and `main` to Forgejo. +4. Attach `android/app/build/outputs/apk/release/app-release.apk` and its + `.sha256` to the Forgejo release. +5. Verify the public latest-release page contains the new `.apk`. +6. Update the static download page if the displayed version/checksum changes: + `public/download/index.html`. + +The Forgejo instance runs on the same host as the relay. It exposes public +read access and HTTPS through Caddy; registration is disabled and administrative +credentials are kept on the host, not in this repository. diff --git a/distribution/fdroiddata/org.skatespots.app.yml b/distribution/fdroiddata/org.skatespots.app.yml new file mode 100644 index 0000000..98d73d4 --- /dev/null +++ b/distribution/fdroiddata/org.skatespots.app.yml @@ -0,0 +1,51 @@ +Categories: + - Sports +License: AGPL-3.0-only +AuthorName: SkateSpots +WebSite: https://skate-spots.org +SourceCode: https://git.skate-spots.org/skatespots/SkateSpots +IssueTracker: https://git.skate-spots.org/skatespots/SkateSpots/issues +Changelog: https://git.skate-spots.org/skatespots/SkateSpots/releases + +AutoName: SkateSpots +Summary: Local-first skate map, crews, events and marketplace +Description: |- + SkateSpots is a local-first skating map for finding spots, crews, events and + gear. Your keys stay on your device, your messages stay in encrypted crew + chats and the app does not use analytics or sell your data. + + Find skate spots on the map, add new ones, organise sessions with your crew, + follow events and browse the community marketplace. The Android app bundles + the same web app for fast shell startup and native camera, location, push and + NFC support where available. + + SkateSpots is self-hosted and built on open protocols. You can run your own + relay and Blossom storage instead of relying on a central service. + +RepoType: git +Repo: https://git.skate-spots.org/skatespots/SkateSpots.git + +Builds: + - versionName: 1.7.61 + versionCode: 10761 + commit: 50c95d0ff7e083f81eaeeee167c4cb7c68e3b038 + subdir: . + prebuild: + - npm ci + - npm run android:init + - npm run android:sync + build: + - cd android && ./gradlew assembleRelease --no-daemon + output: android/app/build/outputs/apk/release/app-release.apk + # The generated Android project is intentionally not committed. This + # recipe recreates it with Capacitor before Gradle runs. F-Droid will sign + # the resulting APK with its own key. + sudo: + - apt-get update + - apt-get install -y openjdk-21-jdk-headless + ndk: 27.0.12077973 + +AutoUpdateMode: Version +UpdateCheckMode: Tags +CurrentVersion: 1.7.61 +CurrentVersionCode: 10761 diff --git a/fastlane/metadata/android/en-US/changelogs/10761.txt b/fastlane/metadata/android/en-US/changelogs/10761.txt new file mode 100644 index 0000000..a946cdf --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/10761.txt @@ -0,0 +1 @@ +Cordn setup now shows visible progress: the device-key step is checked once prepared, and the approval step shows a spinner while waiting. The APK uses the same signing key as the Zapstore release. diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 0000000..469856a --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,15 @@ +SkateSpots is a local-first skating map for finding spots, crews, events and +gear. Your keys stay on your device, your messages stay in encrypted crew chats +and the app does not use analytics or sell your data. + +Find skate spots on the map, add new ones, organise sessions with your crew, +follow events and browse the community marketplace. The Android app bundles the +same web app for fast offline shell startup and native camera, location, push +and NFC support where available. + +SkateSpots is self-hosted and built on open protocols. You can run your own +relay and Blossom storage instead of relying on a central service. + +Lightning payments are optional and self-custodial. Transport and driver +profiles are self-attested; SkateSpots does not verify a licence, insurance or +vehicle roadworthiness. diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..aebe2515159ee012f633f5fab0042b919bf071fb GIT binary patch literal 26231 zcmZ^Lc{tQx^zgMr+Gtg&M%h9}--xn}N*N>6M0TS^woo!;o6$;I$TpQq%S<))WF5;W zMG@AtgV`#kTbKW3WGz2~0&o_p>&ZXB_-T)t%E5&*z*E3^d` z07>{&5-7;P5AvVIW$;7!6dG#-K!iE~F;@YYg+Imo0RX=ffI&|HjP3!TcFqMoGt}O> z(`e_;EeV$(`2TA{K+tL5GvWXL2|>TPr?C?LQqFa$!m>wfI*o%Wpym1Ao!EL)|mg}2k@URsWJ-=`>D7->*^!`;p9 z*Ph#d+NOS3eJ{AN=I!UPbVI%7@!qQyU*s~h&T-aSDUrYFKRpl`KYeu3)9lH+rMHca zWojA$qf_V23Op>5L4x&znkiDRMyOO@x!}6Jw*ix+wR)>>_s2z{Q6L9Bx$wdIlDjQ z=1+GB-VYj`JZc$_GP-o-)$P<6)f@NB^LJxD?YJ;)tfKbLE51f4`c7Hiva|pY`}*G0 z)k!L+^KWzo;`e#cb2mg_a-+$Ag^4G38rf@Y8*vJ_*Iha^s`7QNq}A`jlis`Ao(mGZ zDwT3J?^Qr~o-G?EKK*syRaJG??v0A^roW4TIX!S({`V7`;`0rschzf0+uUI4`K9f$&(j8 z{yV;BsfXw98rgU+uNjA+fBxgxVX;c1Rwn7fs)LgsSM(R?{eFII)~WcQ1a9wo?}+z&OUwR~`Mv98(D1spV*f6`11)P0zE+O!)uP46 z$6t0os`+eNp$~qy+#7Wpl7}xtnEg= zvBlp{XYU$TCh1&oU*}O6UaYljl!SE6SQYhXGoMJ3oyl*wT<-QeW0Q$6zGvn#k)*fv z56}6F|D%Q$3`uhz_knWOH}~VxruB1WJ2v+f{5nrkYA@SCc<1$X5wh*kx?efSwzM+0 z)%^0J1Zn3re4?n`q>Ut0B&KxY=3b7V0t-+)ppxG_FUgxqPW}>#&pJ zpG<36WB4 zX`vZAU9~2W5XtLEU_ItfvP%pB*cht^2QN<~j24j%7jF2D3k?|gAX ze{FeG(4B^1`7r13=lBC+$mccmSY8>P=ER}>q#zl^18;;kw_7FMwxbJXxj%wfgh*MS zs?-F@CMT|odQsYO1u4Hmh`m@FfQ&uvY$&bZulLQ(?Be}~HW?a!av8}%jk#RR;g&3$ zbLPYrcO(Mwmock*SJmpeE&|az`ifXSKBoxGoz6qoeihT+gbXvPW`E_ldu-`^S;0kR zD@me5vIu>nOfO`H|3I+Exv(plc{xgwp!kj)0CCno^2#@req|2~Ae+rPX&b=Vj?w|7 z=-AI-+odEgS!Y8jxcD;mqk+*lT{kmD{=vrC7F?3*C-h4eeMazzB@!biM>+VqLB-nL z7SYF;jd`eQ#V`^GzYHS;!c{=QH%c0SZCd^X4T8&3-)|DbGdNO^ zY>Dm;gjd%x@Gc%=Q?>1aXME1RsFs&^GL($DSOeERs~#CdihcNV^hHnc@yNr4 zfil47mffN93iZ-}!7O>&jz|`y8Gys%4}Xmo_vlfWiZ$D;l2o6k6Ntl8B9LgZM+%rH zeOzWMXR2EIs%3Lf>E9afNeN|Y^ai(MJxNmTRqfqu^`S#R`R7gvpuDdL#bP@rlvViV z;8lS6J-2W5?CGB8(%M4>5JiyqcZvJBYtQJXEH{^olb9q`EA`{EEM4K$ZIJ*nI%d07 z#}D?2yi&Jwan>BE1MvN>GKNUVqbKl(H9#B=veNuvgGc}9`yNj0(rhIOaD@IX-py=7 zl>2d?uEn6jo+AnJ%PzaSd0=}B^w*E*jmUzlmqgKQB5{W0Eu2yU-+wLxptgOeXVmbm z!wiwtMOz8L*9(GeB+=p_qx`{0&LNN_>kU=o^`vg;_|yrHnMc+#LJ)Jhhsc^?5rtDv zMS{iPYYk-Ev(KzM!|KBjRvyk?(g}1nzf?-m#NK-jEBRrT@K>n=Rp!*Muwc zHh3>TBnh5uIdCOwWuDyR>ScTh5C_R95(!LG%9n!am5|uQ<3@FCL2RkXA64-h%2*HL zJN9=+cVuZZZDq{&Q<4DfqT^V~?`uNpI{S;)cwfIc$IWA^s9}N&X^k^ehZcRey@UP7 zkF~63T3(ZmDou!h9Q) zit^7j$n)V1-p~*~i&?Qa>-;x&kFU*aS`(x~A1b~1boAfeU*&FQgarIns7GzI|&4NfE&v&9j?F z@m%h*Ktxpk1*CR8B;xxjxI`xh)ynQT<^Fre8!?1@JY}={P#C=-;gE}=i-49BV|xl0e^e(ug!w`8Vkj z3IOxdGkw~`3U&e==*vJgv0?V_AZ3{T+Lgl)OUOL<6(;P*up^SbDX44lVkxKthm4C} zHpnf_PKS`qlWNC0VXkKXOGr zCtYF{Lc-h)6a9s4>hAV9`X2P_06gK<+JuF7%OkUz^8>H`s+9)4=-;vcZmZ{>KH{JiEbC`3q%pRY>dHlEACe z@1?;;Xm&Y?JYU*;kOQd98xpmR&U>Q3e(p|b-|o`!z9@FSekK)wG~-V8MC$N0?MhW-dA!+mFYD`Ut8zpx9681svFHjG3ti8=jt1F)j@tCE)5!ufDY zwM(9c8`9(lP43xExfn8I(3j+Y$XRUoKq1J*F0^d&B1b)Lg_&gHnq3}YGr!UE(gVGz z2;I{aXS$@nzLhpV*-`gF@HW~!tYLvTWse!&JHgCb!^ziyS3mZu06A{bDpE%?G_= zsuFkbr)v@{71lwqd|9LNI5@nS@NY)eiEGIIzeA%Ojclb89i=knuf&@*KXSpytA9si zaDv}PGi~zmhr!kTwqYdy`2TUD0HkX}FN&{fU>s!L&fl9Wp|E7iWMIKz#av|9X-}DW zbxFI{Z2;%FEsv2JJM!n*4{qzdAT?O7b1}RGJ>)um>Vp4%wz*@e&Nw-pex z9Bz4iDi*E}@Rxp#m)p5LZW6$~A2OG^qOROc@mD#{)esXBC9V7-G_soQ?Y$u3m}$oF zK2k=8Z-u+>H+8{+;&dsG+}4HS%Y2LR&n;?pgOk1Tj}}}kh{+l2 zQ$rEY1mcvQ~k5`3~czd94RmT_^RB4VKP^ za>izo3TufEy}HCCgH=*}S?Hh3V&Vp2q!FvKK$H2&4I>rvL57^RI@q>NrNQgy(}ss$ z3%0BLIwds3Ilsy4U>W{-zEue_aXr$k-K%M}7z?>=(}^At{+epX>SwN{M8vn8%t@Ji zkn$!g#RyyfN0qW^EA^Yup1Gbf>#aE_p^10YoKnON>XQH7#`@h(F|)-CsQ9LmZLl9!QGcsZ$CpwgG7Dd) z+T-)>XYbhyO6|)IW&Tj5w$I*{2C6GWvCNxx!QlwyQ9w!O%HmVcKtP(V5h zC@FifSyJR%tI3z&kP8cZ8bBqSYgOx21fQ|!>`TV4nH=6$qJ+TwuJo zK#td^{k?kh1PWKW9Dt~vCAenc;~nAX;U%Zi-TWUQIC-~KPDB(SZydl zQ%_NvN6EKEMS+S0K|Ez0ilmjBl38cXN=U3{kucY-TkBj(q`>>wV@((K-q3qf0{zS( zO}F0Q01fE9V!qd()uePP<8@OC#whD3*!E=uHK~m2pP1aF=9o}y_jcb?ckFi`b}2lr zrJZK5)_OOL^;ZDT=dD;0$H>+2h9i}^=p8$)IU6PxPCoB?gsq)nB({fl z;F0~TtBjDzpBpB{;>-?sgf%qiqJa6X6BWg#4<)`ROGT9NJ*%KynxCfp!WdZ$@{&@b zueI>BG%vg!pFHd6Z~U>RT= z`Y3oEO8v%x1{6k(OL>5^>a8~eiOOlW!+xlh`b6#~eq6p&BH!laWXRr2_f_E8KwFi& zor^`XE41;Y*m}N4#Pc`y`tNC*vNxC7YhAQ+A-pj@(35qR8iKGYLC-ePHiIYOwbI_f zsDdvvs|rs^&n%bRbIvVdTYch7Yf3FxkvLnF=CTGO;wtCd_v>218|v34GgT*g-BOFg~_>iy?73Tn%5>9t0(W3C6B4Poi(@fzZ^!&CWc>a-J4R8OjKKZi$M+ zI5%-b{%lHHTMiDy>^vFOe_p2g3=DIF&88BhV=gK_Y^S$TvE9!pYmBpluBdsj}7Mqmgh1BZ|RC#o+d=mAx$1Mn2UJSWz+9Hn#lDTasY%PcUa z?h%pXLg5k4adhaMO{z=Pw$yH<14=b|npXI8CFeMZ3Fsg`Xt)nO*^MIA41n%pu^;pt zj=Q`;?3`@RC~30QecvCzraxu;Iz@JnwaQGhKh?G3mCBx^^%L1Gq1VUxdE{0-icJ>f zfq!;`1Tb*a|Ln!_Bee!O8^))qiWXPDQW0+yF&DoE-cR9a4BRTh)~zOgQlU81yst*^ zboN{w=WsS~$agfDxy>*L@2w*eOzxQ^jW3JI{)B9}BMwc@g+9_{S8bhmsKVxFjPpM+ z1`V@aB^vckCbj$qzCX>Wd;Js zPfcLD>n(G+7!*NwKy9EfnY_ZzS~nHrKl|T^WiXF3XYIv!&_(%X8`^PTa4N~8I8YXR zLh|ZvS_R9Pr>nTs)dkNm%D)`yw`s^@9eHc6{-acB8XCIxS&u$Bx<8>snssMPMaJc?ah(iPk}DGTBjp{mCF z8b>hsaxtuPf8@YX=7NrsT`7~gR#Tl?I^k`!wTYXC%02`H5$60$Is+2mYKuh|_4egT z9Lc}gfXBIrS4;hI2vcT7n-Gybd>KKyslRcW)OOm2#H*K4Kly@C>J*OB5R|yi-YWgL z_3kz&l2nX^&@gx|X&!CWH3sN(&`+ z+!jIov(~q1neTyjT@_0}uZ`{9h5~rvU%qx!57-tWVR(`?;;R{L=R0nVjlI8&f9c}y z5<7b3ELRaI*!)yVxE>;@9NCF_GP=YO)vDH>bPC^_TwqNZL>5hLl~oX#{oNi=`XY30b5wH2 zV+rte&10VLcgV~?C*PWrOmVN_S?9*Kyo8iAT|v>cma($~@Afh(jG?>mxkHps38h)k zf}anwt5Ywic*9xE4$MyIW(r)`)XxLhi=~Ah>Lp0y7O3?N&=Ep(WONt!T~* zrxFPTxx7yS%^J~t#X-Paf0{={hR@C~~Jax#c#tUPRt-g@SK| zzR#lO)>{TmOS9;Ez%XG>7XIHk!P)SY-9tNY`ggfFZ@U_x*J#RH8QIbPlwjMoGFlud z4pXiW&!vP&`k%1CIlJ&9jBp4_`Rg<<3(;JguqOlTIel%O!t&-+mrXm?qP98MrgU%F znuBVA%HlNA5y_J-5zGl-ig;shkcm?NY7ka&LM*+5m|XG!@&#g|5mBph*I}0iO_4cv zw1dtvT`T>e)DPbtU+T4>D0o+;T!zsm$ySU8x^|CA6UxY%a< z&<1P@zCKTREZT44b)l-O77LdtG-psCgWgNgQ6qD)2mCsP@a}o}WM9{wbWl2ABeuis zyE@RChE}rC8gSFe3rk|AIzbjE@P$9040j3N4MRtJ_cW^ecCuUy(wo+K>e)PI(M?Ig zkyfc{Sew-G+LP2jQE+?iy~{#P3l3(y4uqExajK~9i9Xi%n{Xa(9gIz4EH1QYQ5$6$ zC8DHynhVrX8J5smt7D&$-?a`R%oe^4S|t}GLguyW1Y=FfK_%GQj|_x?8I5>?^Ofb zm5kW~Ij$0mrRemLxdgMCPVuDWk)0bj-iJ$~-zuK|ZiWJ?k24-^Eqb7u^L@JmS!_Rt zv?mj_0@DZv_I_$&uW|*i3DA2KPt!~^&NSaUGq(SYdU@2DtBqq)=Dj>euGxe#^+54> z_j1PUYI5^UN)pkjb%3@IOS#zA33i++OY}n>bhmF&mOY|+%{!~j$Ldq6R z?Bv@YvfhXtspK^H50jpD)}_Gr20rqtL#!S7)*SiLob}8Yg~Ync+@$J|idopY<1f8s z9~Tw8Y{<0wN;vdf4@~wwBLamJ?nqL>I$7L!Qa3!Nq@qtMtk?3Lqi{*Z8Tx;8uLyVj z(Zx2Gnf6aUbQOs*!a};ghFe;f`xHtFYgR^QaGZ!R8%mc%lPZ>jWeEep$>Ls zhGlgZ5%7y|mb8}(>Y9Hwfsr{-8i+I#w z7kEojLf1O3cRcSPaFy0mQYqWA8(4hLA0}T8qqH8N#Q$Uld~v!GxGALXi4vt^Ww^@d zwrPp7io4+|V}~$T0=I;WJxR~OslBTmw&M#ILG4g6Ef96FL0Ji9-swjw zl+Ve*B0Ef^(`>PumeR?tCCgJ$dx+7Y*wU|_ZJ8Oq}hPr6#|b$P{Bpn4*U3!wSlORxu+fS%)E^!ct@3dYwU7o9m9w)t*?smnC$ESc=M}t^_PZ|VFRj>5e&_wro+u6AB-7<;aF_Wp8mMufL(CB(@5IkP#k28Es zgKwz=hF8k9V`M}n7S1hrrHReIq}_q%$V zMIT3Xa)V9^wqgMqsaSl2sbU#E^+-UoCORAd=4A5lHcDY4w%mF)t5CR;I_kqY?vov4 z9M$o&W4$o#*2LJ>|FThsGdF2cCR4`S+6D5Eul(sB2`^PN>Q@6P!$VU%3FUCMa34nS zDb;~lcvnkwx@*bpiAGCS)Oe%ijkzfFGXHi=YFjJ8Jxm1oas6Y$%jZzW5r;w$2$1Bs zFE>SK%Wca--qo6J2>i3AS?jTbiM2~9=bgLa(8kJs=kMMpGOk6Fd#B=A+Jxp=2bHtO z-798Dq33DVR)#Y=ag#FFTMxeZ5nm0jeB#=}7tZ|$1Ck2RBJ`aOug{JU>*#2aSM1pnr z6^egg;<^>d$BDWQD+&T-mG2h**oVo`=^7_un>R3G>4^pv8eQM8F1tR7&n+|u`uQJ2 z8I958#YE{RHV?$Nq6z^y1Pw}9o*<$x2Ro4mLnyQbeo8loP(C9TjSV4+Ti0Qu_){(> z8m7|CZ~a0kQ{0{ACSK4nt=@3MON=wM&{DT}y8Yi{q>E)$he<(@C zUH+_1Zi)4y+j6%KCfp5St#=FI6avG%0#r#lkrlydLGP{^);FaQ#>nHgIh z1m%+)gAA(;y3S%=wnwRZRk$rsTfM)puCMVSSRa}*VJ#DLx@a;8%ZAu=G~L}*KhK(g ze)I;fB3xUS2!I{>1e5O1axur`iwK{@use|s4~7>pdUEOnusk;&+ zbv;PKvJw9DCb%7VKod0IRxj`zTd=HZMo;C&S)##t$(}!NvT@ts3H#Y9>ZnEu8{@A@ zsZe8AsZh*lHP`xxzriQb242%A&P6AQtU`m=AW))u%8pBz`_kQReaxxbpR6UUM7 zT8Wetl9zbSs~{qlB_4ZXy!$QDjb15wb9Xhk#%CiyuLau?+jxjNt7PTKB+!S)utR1r z52kv#>KLVSYZ1;-HzmZ2E4Bl>Vw6YFFX?Jzi7Qe-Nms?-S zX~o{Of}FYfHMb3|^Z1pZeHh0V$^eDtK?L3KoaB?Kr%YW5kRPBIni5Y4o)AqUtT#A{ z!_GtaDTE#^po%B~-oKfx8-{Cqk1U;lH)>})>QpGpEn5hWjL?{}1MNYXElKj{Bz$57 zFEBbU+lEjT36^L7?|FOv0uBk*N)#gkQ|rqEX9NP>v?a%3jzmFb4!2`%cKhhu1Q!R% z`I9fjnfo-U4lXBG9tzDT$cYnRg)W(8haO~Trlz$L=pEOvlT%`P_H_w9@OPA;c;XVI z^|#I<_;u?L-R(`%=0hi#trFn&7(JF;^b#WZSert&k`2APWJv62w`~6IpjBEPO8hAp ze%m;u0keZYf=%d;jzl`(1q}Jc@8HO_Zq#`oEQ_HD!>z_gDTyU6_-i6GuFJ=rckopzuG_ zvTJF(VA`~5lWyvc@1t{(kG8W>XQ8#2eCJ%v8J4fAAads9VfoLptlYUrv+5wCe9y1V zoO%%R0tW4bXiHyrU+&Z!R4Ue*QbXKY6wygj150BQLdD0viv;3Z2a$yG%1xtzBZx{t z*x-Hek@kV61(bJrq!xxYL$3T$!e(*1maQ}2Zxm9?ED<@X<#3^e0|n=zzPX4Mf_67g z_mx0lgZ7;itwR`V;kHy!!Q|W`Vj_c1noQR!iuyoPi*fo6btX81J2|XV_JfN!zDd*J zR(_xyh|6y0MVqb$?!;4KAkGN_2bcdM8-^21?EQ?Hw9PS2>%(8QO#aoO<5=(jnYh@m zZffE%_!~vXAB4H{#<^7ch?n*=*X`dFPtN5a(ilXY<&kz;hu;LsDQ~>qn6%`We@R&L zu>9{wKPTnk`OMz9D$iTeGr@+rRs!60IJRxTVW2ygkgCMl|d!Bi$UBSyE%*!E;&;XLxZHwjFAfkw>Sc=Y?~pzCm|FLn{*1@q$>W zc{V>wSmPJSDNRKz9R5;Aw*XR$mLWuCOgcbCUzd}eB>_(UT4%+wnle$*@vUSh%zaJ? z)+W#A?6Mmqed6Z7`IoS0L-#kG9eyjGudd_LdLQ@*bU7G!Wil&VPvsl@CGp<5@ z%YNzsM@|~p*em`<(xIa`hJkaF9mX&kDiVglRaYoFJ4%A@7oU*|M;SWwj46a>043z8 zEY(^b&MW@?Y%*|eyu;t!Zv6Y~Bn&9jHzTv5nblM>QvonA_?(&*!Y1K9^p|Zn_vyqtA@z^kGK%52I)$y|%^2{`}AXggXPjt6pdFL6= zoUuRRb%?^7Y;0_wD#gigQIb<8ImI*5B(wpc8_^a(A9n96h6Oj|EtMRoS}inRd1-)N z|MtV%Av282C`*U<&{>V*rr|ziM>STIl|Jk?B~P8ZT?7l4!V(r2DU&XfU&+q z?IK8kSFKYO5c6_wpt~GU!2SN5XfU2x8Gq4TD#9vU1Ecadv3-+I*E;lJ74VY9+?BG~Yhh4N3kuLZTR^8|y+9{Ek-dYhW0aVkQ8^}qQ7<~hbcu1E?WJ*f=K3WyM zX}bQxLJl%nVo zet0*LT$swxDY35XKC=zhb+%Nhc6pRXPje}`j>JUfB()``Y@Ns~Im776cHUQ@3X|}ivqa9}64Pn!b0po=G(5dg5O3VyP47rMr1m@pieM4RM;OPB^?4=T5)q(j7 ziV$8Zw#}d1&BoeJrin7>{?&q)XlreF@nxly`#MnGB8~ot^}UX4>pOw#3?jU+cTw+x zlufHsgLCcQyyn5rfT=`IZto%q%4COYlXEz!+0?gZuWKPRv(0ePuiqEX%( z2<$p817T`ESRN#h66q#{b;wE)VNP~N4g^X;cewfgNwu$DdLOP@}c(UOA{&TC^d6BfvISbBy z5F_olbwFug3~uxmzJ1%Ne!5iFS?Y)VzTcK&8?~r{O`3gvnp4{}b1)He?!E$7Ci_xA zIX{fC!qGaCrNR~+d*G;+YMUHyjByCUB)qiNK913K)5<9`M+L&NK)9BS`A@bO&rbtI zdR@_tBA%-+ZyzI`fc;=oghCO@T80jA(#&gG+;M{0ziq>9O~D*v0M_xPt83<`amRL1 zPd^En(D(hh*mvJu`_TLLI}c*gx7{Y-{7?-vwR}85FwV)s5%UONbD9YP8BmQqr&L{X zIYDw+P9apN7}d2~)F>sS7oExz#x9u~Ra<{q#oAjTM2)n~`DKpZ$fiUMN@E(<09_~a znEkugw`&Z`UIIf*um{!y&1g6)N`Ri1%*q}aTM-R6d!pFB1-h{Ng(5d<&rVKgOkZ2w zv(P|@gSJ?-CQH=8=y4Y~$J74>3FH4b>A27;^Pa}$;x{dRg?R019;dIK(>XiP<_JLV zQD}V)0YCy4xBQWyW|oW(E%6m-QTuS@&unaZKV^J^$xY1W&-S-j(h0K@YvHZqn#17N z;e4bds4g}^xx1L+u&!1c7*sChjQ695d9wvoO|743*5I}j&x}cPLYchg~VMkg^9V7GiLZCbNv%lL=bXdcwAOmY5;_*-o zHnP7SAhYMJ?z6G=8RSzgn1HInz-t!lHeGtv%mj=+cFL&(zwAg@PriMrP&<{Y8t_op zVR_Puv)XHg4YakZQgQToumHSMy$4>|mO%Q=pYuH!h776u3|Og9p-m~=!uZ0(HrVAf zY&|+X@hJ~Sh#uo0V9DdE!@z!xSRzj}%|w-jy!Y*S37zhK7ariXRpV)#V_g%=7ci)w z6U+LEreA@YyT)z$QI`igMM^qe549#9E3;vp$BGl|HU!;lW}+bv9yqQ-;TTvzg=oBi~my5l&<7iZBpc3l&&*JCHt2h5gvd@tAwEi;|9OquY`>)_z|t0`U1 ze!R>SS~qR;yLWlI1ObnejHAPf<2SG_;6Nm28vqvXj0dn^?XA4ggWCmz7^=#Yucefr zv`U)OoWOylOLEHh!1l+dp&yDtZ$}_o*IEz-jMMuD_?&~iX#Pw@k7Czh2B&gia*=i206CM3KlusQBsF4vtGu^!GYn=CF6C` zS2EIEs$fcuSD%L1`wWEoE>E5y7~w31P`BR$PBmh)kmLS1 zMRAa|Ui8vxV2pgp7!#i1TylBszcv<#>3x(`&(V3BzKupw;)fU&x)jDs@?8O?m|hUL zNSiP-H}N(P(xkczC6V7G7S`(#3uE68!(>}atNZjs+Cw!jSnGAoiPzAfOQf4YOqXHZ zHnlXe{cnml4F!iBRf=^RN^|04GLx(7a0XoxmRyDNbzku{bfAQ>f=hlEj*YlBKDU|@ zWPoi z1a;a8cT&tor`cI2>i9ZpuM73e(-5Wx_GKDmqYhzamdz!hpcjQhzmL$wHhnVlCOM2e zS7&W)mN@H(4liR;{-1%{HN|=tbIq;;t%OV3^*9+jnRthO#IL-GwszYGT|0V|U{nSM zrEr&ICpbaXuiiglm1LW;#YIEMb;oj38!ac8=f2xZdWowdgiC?MTTq7aQ#m&Q@bsM| zVR^yS50=>Wn~eO`l*@>0*QZqe=vc!yT^vj!Iq#HsV(JcCmtYMPSf{lm#ZMh$M?mI8 zp^bV?sS}4`a#xGa=Z}szD8h!QqRG;hMmlfir8vON*T3-4zU8Rjh1)5-%9j44nlL`m z)=$BC5N2lBu#(eERM;e4-C3Ta4V^5t&_44qvT~YS_oiCE{}7fUWPqO2&&Rii$|NsOmk?_^9);Z8c}$Cc4WIst%_7oaGdf4a(#)RH5T z4>CIgPg^k;$8GGWfAQ4c`>m#|q;QF&2F@jzEkePh7&ffTH4~qG)j>DC1s?0b`2icN zgNy_8%Y?#E8`kcxVN^KS=f*2ZTat%1tLkjn{wVl*%cYLygSUx9 z!5o)Ggj!^}fXF&gjTn&=BfQm&>wyegg!NuorxGhSF<4kL$dWu$Y+&tAgpB~VcR(OkL%;n2JR zupONorGfI{GlD}d#KIQQAwQ?7T#=! zlmxE!5DLa%KN9fC)~Oro*wBM;9t?IV#^WLEUsqv4fPmuloNTj*;TnrRsF&^ffiA$M zF1c>CS;PANLB=sr+HnGO=5UAF=<$2>!zR%q?n8-@i6C(%N8!*nYszjrD^zoeOUdiN z)lj^n!_bNPWQte151iWH!psXeVLu*Y-|FfzLbIpcY>A|#TzG}gnr5>QBErlR+#U2= z)B0w(he68WlH6r54`VtXuNeK*qq^tf(-#K94$a@~^GPRA$vHW=gfj?t*01%3DT8ahfSfSj<|jSn9|3^N7d{Fvl7mN+{GuKxIju*#xYy+m!r zpX~`^o$g`Di-b_ue?JhOiAMSMZ2dU*EgJ`?pD4cg+}>kbkq}*9+D^0Kj||5Wp~jeB zXhji%dZerQj`PEA^zb(M&S(v!B$Fov*&W|`c`Q0)f--g?UFbRCC{7o~SmgK6u|I4X zTbiwPati`a)zJwe0$dhNCGsCLN@XMZ6iBk?#4Rw5Uxr<%A9As=7bu?(GO~;@{>eRS zrVmslyRb10!>I;%l3DrD_UUUdZw*$xO@F&QRz9kzO7#3LY3qYst+Q(4EYExdV=<6F zgw3*L2Ar&;dx&OX^AGtfv7-B!s*a8--AXS>uR_?)pkMHqgxPu6i@=GV!vdwzAa zmPn;_M{0NG-S~Jiv(9>8%B3WJlj#2)e&ihH?fV~0T^LqbjM`qZ*S9e$%4&Iv89aG0DqV&%`z->eVyqxho_PXJ|FH?6jByEze#%Ld-+_^&jY`_fg zn=z|`8X0GR5>EEdUka1nId?U(?_yz7u79Heh zw^?3T-$5VA>huxqnlQ*=GB3QS@O+~F$<&tL_r9Cv5zRz=IRCi%LuRKX`o`I(25(yz zJMuKm;WD0I?qh{bjK8wv-n`Yr;=QZQpo=}2`NC}f)n+hq@VKCMPzQ4Vew3R^z-8ILd!vlxKJP!YF$eEeAVN zgqyn8@S3u^iG+T5l?>jy{Hkq(SHZ8AAeZXjIRM@N$v=I8jO&8FDIQdc12eo3hxf>G zC5jvvMy>rC4FQiF`_P7V=p#Q}O1}L01?rAyN+=$heUMGz`1^f19ZW zL{$&5AQykf^Di2y8GOiCn(MNs;K13(kX|&SX9g=gJW$z<<$d`m5{ZrI1u`r=qz;V= zPJ#RqR;n8`L-7#?J1i*$TfWZ0jn$ldFo?ei){%@hg*cm-i3A(PdFy&1~z##t*l z8VLKv;u&oYF5B9RsJ;1h1E`wTe)-`y6i2mP&YVYP=a=yevFVKUu|LZ5E7#kAi(#FL z9sO{nq{54d_K!93TU5M+zw+M^xkM;~Yztz=rarkCL#8gn_KnY+$85AzXliD>;qzoq|;nkJr0P=jUD#^^FqU z=36;nn;l^?zoE@GVN&nI^fEBaebsyx`d%nH(Mdxyg9l(cf*su1V9*S?1*NQp+A`VK z_ebvm7#V6mJ;xXS2%Ji@wlSN1LY4#FqLPNp@M6>XpW`TnkKB$oC$#Eq%#i58{YlmM zF**N2c^!Y+FjR`z47DsW<)$RuV<6ozUDJlP>VR;unyvACp-l!TgcB+_b@bPY8mmF~ zZdoT7fxt(3^lx2xt)fJ>Htdt83@>yT0p;LenR3_~ow@JfBZ(eXTt|Yq#uPs0V>7&* zu4>lJH&B0alVRDY`1ukwUqY4uT6RyVk)l`p&)}NqnSzEYOD98KZ;26!xtPyA!ZVK~Nft*V%@0>U?-+%`r(}+PolDwdiW)35~HN6=gvN9xb{%oL<8NB6d`J`E{msqdNpwA@2$uZ zpF7|)lFS=0;;475E=T|ueT~br`TsCezE2tMEg19{zbn=QlET}jIUg60R^Bkf^Wj6q zOnfZS4JEFUs7`r{I%+WAY(# zbkCuRu73pG;$Pgwhsf>I02OrDFC|_CEPno8$?k=-VqEU+H}1b>6c=rZxV6w$WNuQ< zK1^zcHR`K;~G73_k4b zc=He0UaN*(qz|z5^qCs0)*j(su6T9(ABiR-eKqelPe;P?^cd3aA6`Gs{}XarLB@G! zvwE6Up&Be&eT>W3=oZ)X!pHM%g6wJ{Bz*vq4trdczZo)XAZT)l`{QDLgDd%o96g^sK!-C%TfBR`*Pt110K_j-w zLT@3UhDOy^6C>}zKha>NSjs;wt`&t3+LmDQyUzRj7IpC8jGf~1(FJQU51u`5Qv4F1 zoR5BkR0#C%FWn({$3CGk-`EXe-iNZSkQo`CU8-kG7kgTqK3%p$E9Cy0`Nnq`MW!+C zAeS=BvbUE6t}%d(Y}@$pB`m>$RF(gm;jNPry?`BzD~taAM{@Q;%I}%~0|YP>?`U)^ ziyDUo*eB{N!Lx0!Q@x%N`yWkshs)y zFL$)|)V~>frg_N-yRF#i#s8m2ZiWiYTL<6r&IlzL9;H3dvq} zVMaTN$&x8+Wy`*AW0{bYk;yj7(%6O=>oAO2|L0Mk@BepwuHWLmTrSK!&za}B&wb9h z&;5Qq8dvPMc~-d>krLA((FX{eb+NvlmfyQ+vTg4pkF~)klEHc?UV7~oN%hg%)QE;XGRxF{Au-F}VcoNMM7xw3XJr0YIi+($^@WPxc5VVd6JN{q#%Ql$Mdg9RHxu3uN(=`cR0NQR2bek;?IH<^= z-rs*$!2}IA9|<*I)q2(Yk_47Us80m)l+0@X7ZSwl|yMD*+ zj|1Nro4wo{^N}bZ=-ny{+tH_v;4diQGlfeLk4EpXJVXT3L&TR-b?l)WcwH|+IC{WI zImLIuNm*Y>z@rg~T(E8l^_wD!8hyvsw>5g9k}+53BK-0s_MdnK)7`wMpo)8}Qmxq? zsFhy4B4FB?;rVFY5^J)%TD8wq3UO)zl=CLX)dkQJ%N0F>(;hV7CbZ)u~NHTR_b5TRIT{)D|_J5O%7lLguF%^*#=bg zpKq>}&MLjvON+lsF?jLHeag>{D8bQlto5WEaje}@JDzp802uyOUSgRi<+2m1yE6N( zX-6OuJ3BthJI^lgn)7;?BEe1c_MQ1rvv-@*xwO34sF%QY@y12Y(P`%M-c6mm zjPxCxATy?=zQmcSD@>>lWO8z;l3D|2RdvR7Cx}-B4s50LsTN?D4>mIctsi5Q62u@jg zDM{x0*cEas_7=aB@Uph>C^3ShjG$JcdcElx*2)746IM1kE_v2(f4Fx=5U#e=99<}G zC8h0_wDxvwZzpsCUv#yxSc13PVw$GI`@}2ozLy8&edK0_9>4#^d_;OIXRUm}`}mp{ zT~APxjDfz~1nJ|gImzZ~1*)FnU+&R46?Is8;KWoTS)Du8n1{9*i3oJ)KQdw)wKQ9d z#q+8yD#B_Dm59UgO(xGWbze3rJT=``;{Nc{<&-G(1Hn&Xv9A206`&DyI==)T`ia%L zx3UtxZi%0}>{yE|!T9JN<)FqqDbo}KQHj?5vZsk}SA*b=MzLnKyZvI#r+HMon&p!H zkC+ZqwfxDurnosNR)8b?-qKq~xPndhLUyt_GqxpJAuxMNo^IA2bDKmK+2@7)!aKMu z)@_?CF)weSUX?P2iRU=^Z{$mHaCc^rGPT_AJZT1Z9{HER9%#Y;zvll@4AG4;b*7}R z)xC2LTft4IDJf$0R6WNJ_^Eq3W_kNh%ykS=3S=3c8RJ*TuMxE>%S}~EZ7)^#QHBb) zJ+-WGuCuqqoYr)CLfQKAnY$vP?3Y>1leTGHt?V zt%7L5s^cKMUpiit1}a@>q6JBxqV8 zoyfiaOc370(rkvS^1t;|LTHs&LaCzl#gSpYn?m0G3;1_ZC%G%=L4IkktoDm-^cbjV@4)$h~)rQQS zimE*hIgS7WVmR<#!Y8$BvfQkqjG)Li!k;Z(MOCSyi3R`bErVWRg-4SStlf0?vGCn z9T~X>mI=l01cb?(E2nWx#+Gvw;#iTbzykBtu9hph!Lg8>?xQ%PPP4DbMnrN1EHL!EO8!^dHwx`Z0jmP4zpLJ|41&9pIse!3`6@H+2QA!*w@IPT2%Mb zALWWUb1t>uW*z7FmxM`5{i`>$p%yq*1GtvW-1$;u-G+EMK*QN#IllqFoIJ%S_N7FK z+BhA8%$PEq+hiGjV7YST5M;)a54zT8ZHaI9@adf_?KUQFQj=Rul%DQ)ANM_15mStf z;U!E_b?LJ<*jaX9dVCFJ8Au~`{Nm{emox^s1$jhp)N@v|Y4Tb3E+C5zIKALJraf~P z8-%sML^o7(8zPzHO>}lM!>fV71*)(tzP8_iz@(o*!dtyN2|H%?zPK$D-0g^k zk3T4eECbp0qVs8@`lz?lFkF^@V;Ej85a8~FQfSQ2{lA`ej1DH0)NB!*izK8gA z>AE{7(3#jIzRxfI zOCPV6X{~&5p>(RZ*oBmD-216C!bu`Q;ICNcHt!bhk>1LG%{$3a=2Fx1bgiSxFR}?N z`fx#b0@ZH3Kgr9l?Pa#AsZX}^$Crv{f=ee-4d8kb)oxSeMb-;}*UH{IU+unVMfB$l zGq;~_qWu2kP=7xoUJix4szODig@yks(i$8AMXe`nkN(RM_TdG!eY&oIv>aLN{%A~3 z@`b9jkH)B!5|6jI+)4G|66xxBoYI+2nVwY6^O=(ba;S}fowj5&ozjc+#8otnlyGG_ zi0WXb0m7U3Yd-Uap#9XBVy>t@-@gYgI5DT=dVEcY%D+8pA*N3vp`WllUY3>@TVee3 zS^r3Sq=96DYWch%e_F>4>CCx0dasmMIQ`TO>3UHhM9o)lxYg1cD`abPFTB}t#qB53 ze%0S67e#&mkILx;zl#(N0s-TEK9axwX80!9$0&mm8!65^(%qng()P|v1wV+l1fSJx znY`|0b1IdEt#B5YatfYZ$C(D^_j+|F7tzrvxT?Q--UDM|5NK?u5cE5-^mqi-` zEWh3Fd7a&&WErmK7hnHKoY~Qce$MuPoUVHUUJN|IJQMpl4leTrUceqP$DZHvapTO| z5K&dO1fJ|$;r`&OHdp;ylF7MD-?+_}w*X7vt7v}Ow&$FE?y337Fmt1tdmMq_7hMO9 zWZ!e5XqHIDGymP0qU^eS|JG_R`-iV-H5>=zq@G5?rb0zPp!)b^U8Y%WV1kdBic@3f zlT2Z}Rb3||DQ;G4=B{;e2O~BvQ`bo;y*75q_#|7=$U3XEI4P{+Kn1* zHeKONH09`pUsBv#c02Z3cYd~wX*CE(-Q*mMEz`@1XGe!y3oJ%|K4o(9seZgV;PEkk-^EdBT(J1`b=kOveM$;osGdi#;lDDPxMukuq0nW1CVK z!I$IWjw*%?YNyoPu1zVzsK>$gK42;pf5&Q>zf(lIMj(?HoAG>qF`>*;^tBqJrh;Z# ztPyIrpo6x359MpLw$CkK8LNJ^*JED1CSS^KS$L^27yiL82jxLITt;KwyV9fHx(5D+|Er06t!KZL_N-b~meDhya< zpuXo-RZ{79nzjx^T{1ljnQ>d+S=$;Wa+e3@(WcbXb^iRkYtFsrcwbysz=!3ONT z@;;bJZr93of602&BxSB!BlQf|p!bw(XQ4r(a|+VxjC1Ol%N>G6Bv0uc*<_Y}3(UR# zISq<7p%x*iw4K<4r`li|JB|p+uC@K%4hgC*g((DIVn1KpV+^gS#^4gw;|9~QU`84f zt9~f>GJB_ds@Q(e1zgVgd`9Kxf##~W z(8NYQSq7Ten4LZ9OSXo`p+`Rc9yLFORRC}8QJF92?&xbB6nU!?JYM`h2VDK#03;qu zAd-*JkW(fty%jzNXbw3984vE&z*$KqNQUmuyU zPs)wSv({eopCew%`6ui07DS?j&sLr190UH=Fu8O!DtfBI>*h-R4m!HBi2H9M0GRS` z6|UwPHC_Q~$WsK3c+$%!d;^;5N5=9=i|7o2aZ5gA(I+CwD(WMwU&!Dl zlU+up=MVjkW%^Ls#%kq#8pk`Ovg_MY5%+o+Q>otqqc;i|S5Jw9jHgT}6MH)ZBxZ?Q z^8HXInwR9|oT6pByV8V>B$Ch6WXO7%Kz?!hbXCeICYqyXU_i=OtS+CjGBHtkcSma| zG(O(!ao%R@T@=hTc19p*WkA;3ynyrItBRer#2loeLhM6+S zm@WdSRZC@%IQ>ol8TaLCDoy7Az}dZrfTaBkL=}*OuVJhrabXDy&2oJI$M=zOhirn$zN*}v+PSrS66=1N6fc(b^T-1#+sVWp!0Ix{4MnDYUm|AzJnuZ6uh_6Pp!*^QCj12KxFAZ}Cx z+Gckv1e%8J%?8^;srlY#7Y>7yOwEImNaoze&3O-9HYEB#gc@3?w#pX8sX=iYh>$%h05ZHw$B&r{P7Q-|aQN+(QlJX}38|zi1Dw3Oa_}U_&&_k?OA{hz+*@YQv-IB)JYmu$Kk3{knwJIPVzxnJZIwqDqFxc^BEU0G~f_fId80~lV zPAaLBcX|Uz%5H%5opC3S1lKAPI~yE+TmYY0`Uk|Ad>dU}LP~njXC+ztlSY%YDF;$F zO<0(Fw+HIyUaq#FDh@HezQQ1n-AmXHZO5$ZO#`T5D!|qccdU}*8}S&yUBI#DLBtC) zXvbY|zhaL=#YP*c^Ubt96;=DJ90o)+a=&ifuqXoR1Iz9M$xfq#X&5*S_}Y%&({Gyt zc${RLUyQHGh&;g#y=eQ9P7mU$#E<%O4eSfRE&dm1zY0r#sJ%V}QaC@+V7yl8qj`;aAz?fCB?fSFZzg z!Dgnsnq)?{AV!ZCE~(&Cu#=uM1BmgwyDMMMh4r&`} + + + + + + SkateSpots APK + + + + +
+

SkateSpots · Android

+

Get the signed APK.

+

+ Local-first skating map, crews, events and marketplace. No store account + required. This is the same signing key as the Zapstore and Obtanium + releases, so it updates over an existing install. +

+ + + Download SkateSpots-1.7.61.apk · 56 MB + + + +
+ Requires Android 7.0 or newer. + SHA-256: db0279f759efd9fa05d9d1bed57a3f5856777e6ccb208d3ed78b15398f266fba + Only install APKs from a source you trust. Android will ask you to allow installs from your browser. +
+ + +
+ +