From 259256a5502c84e0765b979e77643567531ecda7 Mon Sep 17 00:00:00 2001 From: Peter Woolery Date: Mon, 27 Apr 2026 14:38:22 -0700 Subject: [PATCH] =?UTF-8?q?docs:=20retailer=20packet=20=E2=80=94=20setup?= =?UTF-8?q?=20guide=20(.docx)=20+=20repo=20QR=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the printed materials shipped with each device: - retailer-setup-guide.docx — non-technical 1-2 page setup guide - retailer-setup-guide.py — generator script for the .docx - doorcounter-repo-qr.png — QR code linking to the public Gitea repo Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/doorcounter-repo-qr.png | Bin 0 -> 645 bytes docs/retailer-setup-guide.docx | Bin 0 -> 23948 bytes docs/retailer-setup-guide.py | 133 +++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 docs/doorcounter-repo-qr.png create mode 100644 docs/retailer-setup-guide.docx create mode 100644 docs/retailer-setup-guide.py diff --git a/docs/doorcounter-repo-qr.png b/docs/doorcounter-repo-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..8a51b95e8b11c0a5f7ea2415a77e9534587b4d11 GIT binary patch literal 645 zcmV;00($+4P)njk@f1PKx(ND!e0 zJ4Wl{_PcSNbL(@=g$`X%5y&5=!xjG52SsSZZ0l~e0a8#E$V11C zEQ6L63PPM|h%SN(Ku9p|k6{))GSz&^NYKuZ9d~s4u^ct><|HFc(Dsl;4TO#lw6x4G zEUIs2`DC7;ScW? fBuJ1TL67|a1>IFvGMiME00000NkvXXu0mjf;>Z)+ literal 0 HcmV?d00001 diff --git a/docs/retailer-setup-guide.docx b/docs/retailer-setup-guide.docx new file mode 100644 index 0000000000000000000000000000000000000000..49035af932a52d3ec9d26b31a6e768536a0b681a GIT binary patch literal 23948 zcma&M1AHaHwl5spHYc{tiS3E)iEZ1qCQc@p*yfIHPHbCWX3lx{o%`-P=Y6|=UAuSh z{x5e`^;)GM4GM+^1O){J^s6FM8|Ys?$e-uNwnhpLwswvTMz#(n^lsKx-U*wwt3*gc zn-AaA+fl978c-cd=VZM#izH>Ufu`H6=-*EV>&#y35f+?d=0@;3vp@KP$3OLU&S@6AHF8Igd2qy>0=+9J6 zvx^NuK|8<}K>ZX+OY&;)L1Sv^q>vll%!d>{dCrJJ3Pw?kqYYcn50gufqEE0n2qnq; z;twpw$P{NfAJ=6CCJ+({PUa{U!!3tEpYQ1K15t=!%co24Y&D?x3HSQ-@~x&Kq5&XJ z27GnS3YAD80;Wm^>|(`X=F_OxWqpoZ;yn91#BjyNd^BUSqRQ8K_p3Js@5+KB$3P{U zx`zAk7RqE)08xhvQ+DEmes}6QgYsR?A>LSUAmbbTdQf1Gd@Q(z@Y6~l)D`htI9EYw{;FK02UUl&F;s)Jl#RD-P2v| z6Y!n!wy<)>eLHDCKoz7Rp^~F=Tm686fZjoXfE50%`;h+CeFk=Rf4r9+KWfuQge3a# z1_Nt?yTciNgG7G(RY%mis8!MxIXGO_1QY~?%vTTZXG$C0&lX3siEcsm)Z&;4{p>kv z@kCA`WXh^w6_XhLh=VH>(FqnZ^-A>JLl^|>LwxtT6~8+aZ8WHnz0&KA3MQBKfRGl> zC2CG_Yux?7da{L~g5Ar)r!wF@`;0HxA(4<|f>E-FBKY>+_aDJ9Fr4xa2^v%$S*g`_x7~{X&KqFg@J|&hz=fsg3k7>h*Po$u%%BBl(z>#+vc*U zO$r_c0FI<3`p#8?W?8f}u?3&XWkgRZYO9oEuf!TN(VKqy8#s|$WnOVP81;$7i|gs? znC(p(!FcoHal@9_)4IUNY!&m5UfT;meyN{QUwt0`KB(|M|8=!>FlNwmFtKuE_#7Ub ztxas4{^&;k=gN4pmUKTOQt;**I@twzW$In83%Ko8AVY0{ZGvoxwRvKaF?HL=#`JMx z07fu1|AeH&{;0pqzS(zWarv!47j_fqSPd|>7MWENlZVlhbt9L?rSwf9y79N&gETrq2d|xP3nn5C4PuvSKH=>jqr(CPT#p4nu+eK@fsRxGdikgan${}tu}w4I z{9;{gBY)3u`EF}UuL-n`Yx?)x*O|8?KLI_^ws-C>m-qjR&Q z+tP)3JgQP)$fCUee9%7Ijoi7tVRlT{nFt9@F%bw8sHpUtcj!9BY2v9XP(p&$P_j{* zeWu$WiX;-`!G{-QVUG7p=kT(MW=Yh>5nSsVLZW7x$Pqy9;OwYpKM}z(=OpMrY&3g9 zyLFWO@0dy8%3L^+F5 z;tURPb|6UvZVk^N*Gi-l2`xKMwdBGY6b$^I+E4CCUOjVL)8ozD)pfB2O}het zXD7&5jbJcL+*#&EPn_ak{87bzGbx;&lH?7Nr_Z`#^T${}a$ntO*Djln++D|&ldAb)W-14!gvJohz>2NU&yN#!5 z0eUD(mRl)1J?-?@z+T_q8Ehvxh_Mo>K39>gG*Yv+7rl zTR-YvwJB9_R_s2zbk*(N1_#b%DTzo}+IQTCNBu&ZNnO%j6H_%NYZC9*bFZfiNQFeqlHF=y9I^z z86egYr?=aC^CjYd;_Cgx{Kyq`16EgJblJA+{i4s}LOZT6p9|G~i%HRp*{TYB@PAV~uTAC#>h3Z4&=OrhlKSg_g{^G+lws(>{TT7i~ zoy&x#=>;0qAuvOj6Zu$@R~;DEJCaMQQwV01wMY!t4F@*B;j;`2L7i{LPBFb_swCaCe;*qxG)EB@uVckbc)g}W zu5}!Wh&I$s1ifcLaL{Be9Bhapg)<7ocQELKDmg>fbyV6`dLCv4M-tg==XQTb!Mo{hFPN-IVDVLQ?Mbtw!Qrf7F4!Fd zz}OfN^liH?PcvBYGaTLhmzRW0eiIuH@YOFN_`MN1UU}3P1|AtE5GV6(L}QMYB_!u- zrol6%k(a6>$cBVu%F>*e;z+~H2a>`-AmH}X9_*bTa`=>L4hQDqJ1HHPS0?I5YIN>3 z4?*o#NQO@@Y3!I522=&g^j&%wJ}1UosuuCzpsiBVV2IpiskpD&lTK+$K{3$PCKQO3 z62Q)hlr0FAob7bO>rCA3>9Qn~1DD}bC?kU++R@OFndcqYEghzx@-cs5j~0o^iMo#@ zs)JQm_)V(zyacYHyRnHB^rFfXIsu(9YvtJf|;`Ld>Qa!|+WXL9HuF>9s0i>x_Y6~~gl17|D$s2~(lSD73sP>$49 zQ--A)`=*9^dyvdwUYraR?LM{94scK@a$i5F2u2xnCtGZ}auEHM_4>x}J4{O`Iodke zwu!v#%NkAf8lPwlDM$Eg@B{-V9-j};fiwEoD{|vbZSVqLbFRKF#PpynDCoN$U+SG) zdTTM;90|STD~G0en7cgwsqZQ9#^3mu?RqSp%0;NM`_E#2tv~+=__@6=6i|F^qmcAD z`kaErT@!TQCs%@HXaz=B@_#{x7?<2ipXRrPf`w7_wSX$20_T7cA#Ooc#SC1WOcRG+8*@tRdd{5;H+AL^A1d6@CT`)vql3iOJ&#k;x3 zst7*j5;W83^K#d;H$>hL}e3{=HETI1kMgn_bIu{u?dNc`H#=mMf6R#M61<##)k76yNf!AHBIds>J# zKA~i{G>lW>VN~@Ct4X4ZjftrZ;n=8oo5dVXlf!N)(CFd6gS+f`q+CygfJTiOP19OppKp%5)&GeqU1 zs4)qOLn;Rzb8>{CVoYpI^)5F`Dri5-3t_9GY`bYqF4ARKMi1CTqnzLsxh&wDL6Wn^E^0{Iv46s(JCl+*8i08G#wG z14P>cz+ZF%mYQsVYvhwIs?xfeO8T{TuS+gk_!8es2#-Splx0%?nEj}60@i8;CY3$Y^FlAL}?(eOs7`;D06UMZ`bVvqOy z1mCaXrK3ELZ^7rR5ABl56mRESCqf@r9NrQgUJYE)L2ASAZZTE>x?FW#(*r8RmrW~M zJ<*3DMqrG5S1GVvEE~io0&h@@elL5J-~@{Z?Pr~Kj`EREd0hS>*ekQGy}6`G=UTIN z4$<}uEPE?#GM>XE0%@Wmbcr!e=|a@Jneee-+&(mWR&PlMDtmn<|ElY0ca{`rz$E$`*)1_sRyQfPG)5}xv*?(=duO@W;|N~3tAO9AX0m_R4VXueNTyp zC3TFt`{^`*4@i-1KLU+g0avqsYBOGLc(sM zKn8F$TGTIn_pw{ldQEbE`1teA)#}g~;sOf35)yC-xqg+bVz6A6@blQ1|D(-&~Db`gtD7#6^sK$gl=lmqvY10so`~E zZ3N}$o(l3j;&hmQDF_X7e2mHmGzRKJ1`L1y5tv7!kinJaHr7MfB|CMmpq5P_so*;1 z8i@NYDWpoIhB3?>4ZW{9jFgo3Mw}Qr&M*imYTjpcV$%q$q<}vBbtsxPFa;e(ILji8 zJ^)5gg7G}o0E3Tt-U}cxH4%sJ>hxTL$9BE{h4hnnoG5%y3}Su#7z6DuC!u5_Ptb;b zlEnSd7UJ4{q9YPNdJy;OASh(B-vqE?b`Yx^CQhR=x zcCG3KwL(zKVNYV1LZX$4A@uS!-cq7Bvd46V2M2luLyCoRN5+RzmF$y95uUU@prvGz zvqKtL1?>Wu~B~N&b81x$MdEa zC?~}8)dd=xPWS!?6jMOC;IF{(pKsBCwciC*zH`4mE$?IT568w43B|qvfv>BoF=wiz ze8vrsq^O)om9T!mpJ0|eyE2aWOo{~m$Hd5g1+$a6iM0vC-=67D`ru4c)^?R0tMlR; zQft$@OLo2uGLK7JgGFHf*%T?=EC#L=8YOqQ?N?7cMtyaT(_bKMXN*=fQy^_lUBz0V zm7vd<_e!9(i!!Uh+-nw?vFlQg}-SQ5wt_@!=NZ1R@C+kmxcT5p29p58=YOJ zx~6KYblwhOI%)BLqk#SF*kZQPib;CkQ=$q(Q9c!qB1Ko~DOHZRZ zx@QU)n5&Bm)tPBLj~bdIH_xN2{7Fb$zjeX%cx{|F*sGWsj?c5k6<(kJWH(^mRO<$l z8>lg50&-@s(5U}`yh#`bYC#+V3XN+06VInYX-siO!Y=?|k_6rA^EiEk0`?$KBc%^QW@yt&SPDdtiux}#u}Ga6Hrq6pp`5q6@W%rOchtCWs`IwmQlgl z;FZxJS2C;4GCjx4dgqm))}odV7SDP1TLjNho*p2ADX^7~cv8QPoig{;VLy?n z5qNPR3IUuiiAY=2&QQ{F0^#}~NuBZ+_?^k>bN`TnA;My(`_*hF=H%39=%gP1>)l>~ zI0NCk5?Ggiha}4Tb11`y`!)9S%ko1tp>GEm))#-@*Vm_uF7E~~;>56To4ju~PqW`P zeXbT`V+_%U(w3);)x>UQ!xpQ9}&r zL^*zlI|nX431bo(H$&U%j_Axuvt}1~dW0nLZ48EkSmvhJnKyZfZULr^7P=+4NV#-) zLS`vr2L!r@l{l(kBMeN4_%SBUf_gn@rTI%O`|{X4vGB~g@G#w&J4$VjYa4>gn_)-k z!51My$hJ5tENgoWTEay~b-qBOnkL@-b48MG6$-9L{Y;Pr8R-$d+GN_*#4PNCUuv=~ z!_qg3pYiWv<}S3&T`e-Rjk^NbuaDa(2-QopAaOCsJzKlzzzf?nQzMbz7&BHNay+!a zP#)V$vLEVia$G_@R%XhbuCrw>G^gKe?VEVo&s#=qJdH+{VzQVVXr^%Wfr_#34DRh% zaS)$=N0wf6=Vq{zkz&N5`u7QaX?{(TG8^jQA6BVR;*kN7O>ske;`Mu}E0W)XP1eQi z$j#S3vQzx(>sxqZ&;k&jZq;0FXH;>jv6Wg&NZ|MuoU!uUJXfm2O~*!!yu);)Xo05~ zi`UhWOfW4$JvLW{IN_zzJRq4$Y)$c=312>C~#_%7uM%0l(r zgbNxv`5nx2j#_RmOx&^{irA_-3o1&*-dsytBJ^w94Zh_A_?m?bbpSdN8jA@~|6EslvdOS+ zxjp@E_#?|Ib8`g1np-G97&Rq^$XI&f?9HW3t$YwvRK0sY)0ocxLZG zB=e-Ll`E8#4j*@n7e+@!ci;z9)K+2@QP0Qi{9CJWu9ThSM5W}Inm029hzLDml@)51 zwhaR>uE=bZMo!bqUefVl4OuU?> zxPjpb{ep0fqe^J69BaBme~8G#ywWL3@ghE%7svi0IyM2+5IIU1ZLnjLa&t3&5vIo3 z7swvbm1{&Ki-gCoTTnB~cEmzRVsdn5+fNfs#gcOSjv!HfuLp)dx&tfcgJt=r6K@=dE2aQ%U;>b5|B>&V-k+II zcKHCj=`-(IM*W|bai5E;f8<_moUIK_94u_i{!V+D>o%E;XhRndXvj14xKKz5qGa=h zWlFA0vYHP-L1|#)gv0ETo^7csMrY`zc-IZAIkOs;aTCcs2d}YDgpk*XNKLNtU=M0x zkqOgtxVNCyq2?3&WIBZ#4?{1RHH)as1vhXk5lR=>&=)q(=PrCd*wTrsu06`Z&=Z}H z>53}II~lIYNYW4MU=-15uqe`1O1!qKv2(v=?MXlteOW>bB)XDRQ>v!xQ>xx~nptQj zHknA*4{irwr~k^Qbeu!b0&miABYo<>&LE=Z745Mp+PCXyz;h&?(Ggg$LWzsBpU6T3MLD2@#h-OO23`611 zFVQ)CnAB@~ntXD>D9D$s?z}dQJJwvW&n!r}oU^Ep1EAY2ncQw zb!I{P7i^yz+l#)=z)tvpnlgKCtHZU?dtuCb5{moZOXk(kdR7b$1`IBSws=@)Y}=7% z1N5ixI!mySgKe6j42>L41`PIwwpciS|0AP6jm}!a#U-TU_NwWKhxIhVyw9I{G@t&& zMe8iRZ1w9JdetBP3g-KOB6*j@+P*^>9CoXV8GE2cg7}vqq zfOYi~yKgDpzaSlIx>}fmUw1?5x8H zH?{plxY?=E2qy16;*+y~3vrzOmb`kMIO8sdl3ZGs zM_+c}DxH#RR|C4N2&!$l3V<3x&S){bV*67gf4b)`PCyu5wHCEAxS^6wNGQ70l=90&zM;gnJnjnuC8BV1|v^$HypjAz$KSP6$&8Q_Gco(M?0i zMj-VY>IFpSLiWfhf$in{f{vABLBeFdF7g}FU7^(N*CnfH-FZ-SC-s42$pgm?l0B>E zMdGzUDx+`AA-;YV=oXj(EfX}iWu-$i#HX+WuRcKCN+Wajc#};xneMOW9D(%BVCB6y z-1z))gWz-aiYpBzn`oIZy?$3Np=gHn%NA0u4H4Z7;N z7Ob!zId}ai7%FIC4B{n@E3DLSN_&ph>YR-Y{?&@a$I0Yeno(2}(#B<>0@5)3 zTDvQQPo>!R)dEmvArsv}<&4JH^-BMw9JV_%ZH`8PL32(k2XHiT;k@!#AZKT;;jr(8 z@TDW7K-n{sG@S;|BC*3IoBlway%phYARm*BLL+QXQISU`ihF3Anui|4lJCXQgR>x(4F&N%{9>-On5Z&_61=f2+8a zGd)tEOh^!0p1FqUp016mBF1$cVN;nB-hOdo=Mb4P62+RE8wxP33TizBEKdgqq=oBv zZ=D_`N%)Z9KU@7H0t`-i^R}EH>f1wQo6PmhtBXXg4-KnEVRYpOQ+YS+-23o-c^bJi*4ep@)1 zSpR)>{cE%6*zwQOK2p#Hzvxn%?1_+wj3@FBj(8Z|udT9yOfcf% zwb|vg)QH&}uY_|d&QmdM6R!_To-U)tDr}gw9`K1S@Q1;R0V7PT?l=biTj`di-0s=9 z+`*wE>51{21PI)ZHwo4F^zIw}PAv7Vzna$?Ho8`Q>V^3k9{)Zx{_JG<-rTvn;wt#=D1miEPz(&$6m(PqY&3sMWpGIavL?^cFcJjYKnng>%T zMT%lBcTytASX!_~>yFLBbS?QR;lY=O@x}h^!BKZTxu)p)as~d)096J~{pPQ3PqTU>BnUl4i4+f{v{0Vh%DoRHy(HFH zrm5=vkl|!G81s;Q{^GlSb^C+-I%Yw#05+@%8ELN9NeL0Wy|bP*RJn!A<$TJ1GMfXV zngAWzjGOUW_u-qD{#ZCNx~mpT0mA5p`hYjqS+~rlw0{F~r0|&riYOJTv|Sko8!)sD zcG6<2Uv;r;EpM#yiuO#3+L4WXZhl3vM&{|yeTSG6ojdrwkhq2!+kKXM8!|+zJ9@SE zrY+eGatnyjgDcb}zIZ;7jh@`5q`$M~4MRfj>>s22Kb@}i^>fDj+}ok2;%;Z+sPkvA z?oi{A?_)&Tc%jL!ptSGvLpnCvViFD|sUcqMtPgo4UZp$hI>=H1R<)L~FbGdt^JW<8 zG-lKtrPlCw7XE3Vx%hS>8x5SQU+vK6wB6A{++PDOaqM6% zXizk#rWD)cA_r%3;e@bTyV*q|LxVVC#&1_x(1V}kr17-t6CI1I6I24Qp2aK-p<*jW ziSnRLR3P)T$Dm#W)~4#*py|4rV<6{VPE61|OLCYwe|%!0+*H9|;}7F;w~{ zbi4%UhWB_WD@cF@QLyh6K)B;jfK{JT(ZVzDVDml?YeqDvsB7HwR>F_u_VK0PN zb?Zha-Owp5W;vDE&DmHPY3^nG zjt=0m4{WjAKjS`0HqBuQ#Ll_e>A@w z)5N2Zsmk03eM!jP15}kAjnP*-lWoX2A4@GJ*qEu(dEV=K8VCgR!SeKGx@X3uowWx@ zMkGjp5D9MifdLY+r*$MHfx>SBFL=QCU;6~!uWNB%*?4mrL*Lp$r!PVf1MRx_tr}k@ zF9_aWsUB^f89B4Ry^LGBE`?qY_`u5}emuT>+#+sv3S|4P2bT!lzPug1*j^BHW=&Ra z3h?JF==G+~AGwAu+7Wu+dvSJFOiT;J<`Q<{$7C+<7~to~Dc&%&iGSyGBGgk`ed}vT zkN?VgTdPBeSkia%yw$&G*Tz&5sw~ zmxqrlft}ce5?4gTMN@v!Nu>3mQTEoN2YZ@S+bot;%++!BRpWaKACEH^RAbNBtBzcs z$j-~f`SbNa6P;>W`GN0k^Y1rzn#~{QlY}?&4sEw+>(gza^H*)LH;jMkTI){LwDqy{DH$9SJ47-Dd|ark{XE4o55 zV-F4kT@m|2M+XExE@$mMImP5I&kfk68GPXM8ZVkMWwAmB?jm0pR%IXc@;#q#sMgl1 zKcwS0zpea!zHE$rU(IL^zc`h{{YZ6w^oSv$eRk@KfWI_)4b*u(YdY(=**z$c83F`1 z30DIKK0MAGl2$?%MpNz3A+PmSPR)zUNF!Gii^#3+$noyT2ajc&k7Z@%GSkXAm=bM& zd#NW*m`!qa5w(ZC!1h`+cM*97eV&kgo_r>sV0*XL^pNiN-UArTju;kx?r!$m4)*e2 zT6k^*4{XNfDeGk1Lkd*J{G1$`KS>qh#YbIFslU8BJCf;`N4~7|;Uz?TnH;d8g>A7eah1!J>hGw_CG`(1{j3z;@XYI8!^h95rZyjt!LGW;iJC`nY0zd~DUU z1ptS#pM;(rFdXy@F-XqPy6i_Fa96(}uA*+wR~;5y;*=~;q2Ecn?D)cQtTv^dOvRxF zeE;eyG)7bfIxlJkG(s9Bv`TTY8Eh%g$h7xPk$0B(AOLQin|7gdC$l437>A>adbgxQ z;1arXvl^33Kz@wubrSFlbu8rdJvZgc=g%zZ+`uOfd?t>FT;Y917lt_Kr(1E6l__5@J{I*_G2~B6E@rE+Qca%eQCoqwkfv$G^2{6WnJdIbx7sqCSU{Fh2 zc2=vgaaSu`P$kxR8TL_8~%XtKf$7Z!Kv+l&i?`aCp~yT=Anqu|H(rA_YX4n#EwIW4P%DqPui)S zyR!F1|CG>J{9oC93jKf8qu-K;?vDiG*W{kle z-TEr}|)&%g;j@OP@HhN|?f)Fxf+j1ssUk5;FI*dHf(<`{wt^4Vn z5bLvK%yDf+PcyZ%|C?}#gGqvezDQ5%ob8P5>0*Zprs0;SZ~JB?dwDX|wkY#Qr!_~Y z?P%Y-7w>7p$<;#nDg(V9pH2#g_&3*8@5hoRx6PH~GcPxZYHb%1(T~q!2;vYU{>%Ig z7w=$X&#c;eZ6|vhZ0_WdU!iNy+E(K#KYn6|SrfcX6AcLN+Ly)}vZmG;miarIL<(7Y z-_KR!@2R=^O1diu#aK!2gxiFNrgcqBH2=DqogEQ^I3B~<*4iJC;8#}j%p9{q!tm(BN! z&5!$!_xI|L=ZCJhiwfBNd-bY!;dLWyJyR~TS8T`Fy^fAZK8BAr-gr5ywjKSHF&N1b zfC`?wCNtzF!;m?t<-<|B-8t1jO9>FaC6o7Dz^$TmxA+aJM79lXi3D&H{@tW?wm!F} z8*LLEcbT-k5@xrgb#dZKoSda=k0hOwQm-WX`lLZ?F6fa@jNi+;qAO4P^m#Cc4a3K3 zkZnwQCs)YrxILuz>`|%h{_CW}>6Q{1W_Na?8BnZKI>C{!N8zeaES~Eesr0qc+dG%R z^8wh500sW7e3S3{5!_Cf=m)QOf!D)?{Hi+KA#^WSiOfNkF!w=y-~`uEsU!8}l~y!s z-%u!!F1L}#5!{Tl8UF2zg?I-VW3X_`CHHmCJU27scJDURRfQYThTK7)^fiCjz1qR` zUe7urY)rNk%DPK9MSzHkE5dTj7~OQ}xw!{^M%0+@of#rRXx(LBy)n41a)kZ=LhNjSgMH-(0f+<2DSXSVR#b@_S9IaKv9m7>Mb7Zup{j) z-t0zK(sQ`Zw7eCOK+UxLu_w6jgP$>YT;5aSMR~@1?QR&`5Q3-0V^*1XqB%FQ41S+Q zBvg(_2lP7OkTx9N-NX~#+^U~RjLrFVJ6Py%i$(%bZ}YW@|Sk_ z;YJR37TC5JjRTEDdMrrEvhIiGpWRB4@Bt4+eWW~UlG4{Z#^c(ajZ~ABp-nsY*X@gI z8M@QDG*T+pV4$h2C&{5gSQ z^fx1zT|(ts#GM7kB<_)l{DLt*Jd==^nP3yJBWM9pTSv??bxK^>t%D$=0d#7N z2^34q6d#DVT5{Per6S8;bzcJanecW9Jry9B2;IHbf6D!^xU_d4IO$=6OSHuVW^DH9 zwmuzxl+f$9mlg6nP;1@I?10RCyFc^TXEk8xY%mTb=gO(%qy>m>gv~vTapLtJ(9OU zoDQ$<-nJhei%ye#SC7;(UEPr&+e97g@7Yk^>KwVF552CYjbO}>7Z1*X6?+Rbvo7TG zS!{u)h#g(5Df*UKSHzb-{x3d`QL41I0_jD7{Kv$h7kp@_Z#t&3ngIba060BVCq{>_ zpc%DH%I|K?IrrN2ru#(ZYI}Jw8zJcCJ8&_DysM+LOv)>QmqpB`O=C-Kjx^891mt8nD`t${DTH!AGF#@?d|Nh z7*qPO3R7B>U6ll6aFraKJSh>#+b)?4Ohy}zVtlm(bZ*~Xdo4vDCg~8&LH5&QH{<+*Pco2ib9+6)?AON3ovw657HxOngW_s;)}GS6~&IK>Yuwa zsFfNN-oVpe0&MOju9Lyar29|sC9i%wL)33%;m;Ook=L}lt)2tc=HSY0GhD;&r zh*#1Okj%i=fexjjS$S=V9j(r+h@UfynDjyNxSdiK!R@}Ek$KOy(@=hHbbhmYxw~6G zJcA4%FEz0nEyxg9$71YE0qkfIymo6SPd=`g##|JI$P#Yc)?vU^8C`ENC-m+0Jtus1 znN^>^!q4RGjM|Nhv9$&WnRw~23~^L#+C11AqmyE9t(J_#|3VsM@cpKBA;Ij>bGIW_ z=ijftAb(L82!MKB)n~_kMhTQe0(&cPUk=sA8%TXQH#VHD?X^sl+7WLTNbnd+ZAWeO zG4SF#E4c;NJBKWoUMhc#3}>snhaDy0M)zexcT-G%2|kOW;csE7FO$!4ud|r*mmV8G z2fabiHnb@(eLGt-QS@edW|2Na*OOo4fM-k)ZRmKqbw%ZFI!>)>C*k0)08iDe8H`aX z?&`GgoBxjPNhlfFUNTxo64m4F8VQX_ff~v*f=zYsddN6iDoRS$;33U z7bm+nDc$k8!WtvgC@5RrbrmhaEu*^n#)hc`(J>|QneO{D(#zfazLLO(7^N3#=eL)q zNe2PnFCkr8{@29kqK3V3V~$R7;5A*y^U zsD?{)Sogq22tRh8sI{Ldjuu^z&W{L=S6N$ zExrR)*}n88dU`iQG-=_|i~aC=L zrIi-Ouz+Eb8Lws>Z?ys6quB5?-wLlLIZ{KCl)c3ixrU9mdekFutet)plZ3sVmZVXQ zlwBZ<2;eO?29oeP-$}wg1*{}uRX?za)-R?9YQt%m*~~JkJHwJ}O=*}(hY@*Iv757p zl&M`8wuF7`mwGD3v7*SXcbG7)VT&i4S+2&ta963X93rE-+8$cspf|Xa!mtHjk`a`U5Sd| z@7=0<^csJJI1)qLNa99&T;xo?4DLE`KIL`bI*qV#jj>eerrjK}#Tv;!gpTIr5;lk$ zRwQc~M6Ap;M6AxltWpFJuVHJ4-D?-a;2r$XkTYpQme$xw*f(8Lzluel<#dk;TlE<4 zb4Q&XkNjIBHFn?NS2rWqa?0Ohe~P1E(m%*~$Vz~?Z(l+(Wu=11`W;HL?4p!A8D}#1EVnC(5ien2-q@gX)a@Rp3JQ(58~|s&m7% zgFZZ9jc85!LtSo0l9dXZOvxU#m`+KOu4-DF8EZV)ABy^o-O!UIitI%kZjJiKuNWUW zM4H5|)e#n+D3@VY-{(7pIKD${=bt&P$blc#IvLbTeA7h>iEvt!|GMbR?dL>Xk3WVH zvhB_`GJXqjgdvliDs~7xgYNK9F405*94pbJHcsSJXBtPpB3E*z5=SpBPZ8;~H{jG7 z?L^GVG=?$v2YUNYXwv@ytt9(z&``=xsA$+9XuZf72FdSFDDK@qxc>e>pwZO-4cbNZ zhim3vuIghLcE76tLK>x=MC$=%Hz?$MLaoB*y6)LF0w4tOHkB*7ho`UV#%biUQdLX%eALh%Q{uRvIN(wz3#o+M;=+|LJ|4s>tyE{x zQ0h^tLQ??5cKwV3#+qWDH!7v144PZGsT?O{>EuC!Y|et7saje^A9}T^Wv21Aa@yeG zG&D`RBKSM%js^CuBGU&#GkJ$He^5{Ho5-0P*z z)$DppUpE2Ql(N6h z>sR~qsxp0f>Wg2mR&%G~OFX6eIV!`$c8@|fA|&ktHfG3rZi*$$SJV-2a~`NwRjQ8W z&WmW<^*uzVFgO!#U2XUJX#Pb+k;PVx#iP` z9C8g?qX&c@*XZ`P#j0L!^>8%R`S>A+Sw|F0O?`x_$&`D+hDc6HvKPmd-I z;pcI@DG%3IL~q*LGP-TE!Te@eA9R{5zPVYB2@oRMBFlIHX_h;z)LQ>GN zo2kKbQD560wBYkht~^*(^?N+>l=8YU6CwR*j3L-In0|*HIp{B+kpswIHg01;rKGzM zbh{ARtKXqTWbI2R#xnMxf|adq#IYZO$e_|ospSPJL>u!4G2nQXJBx#imzIykm?5si zY%z@D1PHfVuLQ;Yl0{$ zuN^_xnPPw4CTf4R2;(z=6DBYBa$x7CVum0a)L+_eW+VI37h}ejz!X;!RErh(s_|pp z6b{z2C5svD_xVsjDKo?`UCu-hb%DJ)Fm(>zL7+Kg<`4{Kh^n&&u>9iYSya<;=8#?u z?kCV>k6x@G8I@$FyhIWs1!FkV?CNirMvNyx9HiKw?o(KiOv8j63)X{-u*Emv1tJdL zFus|<>33YlTm&A6I_40n{5$Fac)ss4Avuf?#Hgw!aEFD%SaVo`2I9AK4b*^&uZB^^ zaJw30w1Y&xhLTO#ea5YL9teEf>qq6+{1BzOZqlkhp0_J>f{#PmVu6cEjp68w;r_Sf zaW;nHzTJ+Gaz6wyeOmq#;-q8@XBpK)oBYv=6{x{|^J#gd^Q-}^UD3(5ajbx4Lr#M) z?JriPBUs%Y+hq|#cYX2LfyW^g!_HQbY+2izKV|PfNx#Q8GdF1qGZ) zNtjB`;|yRm^W^MtaPwr7LwydCs-zcIZc!U zz$Lb?b?nCQodTiaB-FjWH_orBbF(mDk8Fx5D&r->W@{k3Th{NoQP5xM2YBxMs+#h0Mf{}+l6rB_J+ z1>}>{CpBwnE>&~Um%_Jr<$!0TtY(Tf+u2)IPmM@N*gf(Ff{B%y-Z3EMoC(a0deM_-P3gM5UGvNpvlh z3?-OWqlVNtGLS(>*y}J(0%U;*6yIcL1{7vrGs^=sgAUsbjI{XB!Q`ygBnwIu*HjK6 zm^NbS4n)H6{r@ZE%;TZ@zdwG>3}eC|Th{Dk9c8C1$&x+UV#>bnvbSK6veRNosq8Xk z8)V5^Vua9Si9wb`BotAZx-|z4DJO1+UIIq`vpX<(j-+SkIVt^=CcXFni){hld zc*F=|kmPlME`%zGBK#1GQUjD5T?UMbrZ;76wv)fiV3(r||6O<|@dH>m1#+iw9Ddf$ zQ|y1Y2CsV?0*tlna)@x%on^ZTlCo_eJK5{zGj`p#Xl=p!obXC`c!yQZF`%vH-A7K~ z;|=mAK%2OcXg+F@TI-7eDCbH$$&y#v3s&3>-k z)1C{dv>nJPDw^=3-@D7?XXZhlRAW)Pr>WCEdgGxF9*VV?0Oa$1ub*bJil9Q*9;|*> zy8IzrjPTaC2jb9fOE`KwVBo!#1Y~fP>)VY043@@F^O#Qb4^^eLq6M71Aj4E?Dz&b* zbJH0Dt7@ks^K|NaE^EaS)~eZbxRcSf2b=@C9R}KsZt-Ec7rJ{TEk~*XJ_H;@r56=H zk{I_p@V5TVwF!Q`UjPqH+C$sBEa&IlM73M-4{ghN5qbVu#+_8kMi@8g#T;ApKy@}V z`%yj`_n4Sh!`M>3CuuRwdZwHK8@KzP&a5R;7uasXDP7YUX+#Nk%Lil%l4CMXwL0Y4 zot~9_wCWt3Lm^W;tkxQ}5GDQiMU58QTWXrLDzuf>c_A81MzP}jif4gsLP=wWL2D%~ z-5b;qHZyF!bCKv056!W-m{$j!ZoT%@Eb{rHN+ZI6!^9wl5Uv&pzDd%LS=j{L>u`zn z25c0^Oalg{tqfW-360WsV?G|{&b2)w{n+~Iz!}2fQ*2JmG-~q*>EZ!QPPw*DeJIN>18-`(g-@Ar z6{_8u59~$pDDlvgNPSL;kvZAw;7NF!LeOco$uCZPcB#wN;;Z6ZOh0NH8YQil9gCc+Ael4SbHJL4+&LBZQ6mT^A0C z5uYI;P{0OtUkqY6I-MCskprHc$nB|OA?$zD3Y-vKu6&UbI&nlm z9lS6;056PiWVn(Y2AY!?3PBDGv?@{{Yp@t10B{61Upg8TjmGNu0N@7&F}z6d4jjJX z=J%cgzO(<3JvBU80fBRX`x`R2&Gt0j>w{f2 zUW@ocU97GW1b%s-!Bobl>Fihs1{yM*;Dy1wx~QVPq85tp4J0XY$%2YXKH#3k!#iqU_X6_*s5yMl@MbbVo|3t1*}ny_-yn?Gw>`@J@}ucM43i%;vqQ&YJg6tI*PNJY&L<-1K%zgem{~jR0Y)YR(yI$pFGt3 zu6>1hOkKHDu45sSg|oPAA*weDR*~jzes9zL@EYz|ou8$UF8VDZBij=1g|iTQ5uZIN z$C}ak<{-(9pX8=Ra=UH>x-qL4zi&jv$|VktqYsk`RtZ z#tbDiG!;OD+|GF?56MV=v%Efpcz{4S2@$ZBn7QA6YNonqBPNpHYto~yJ6sWRWG_2^ zEby~WFIJ>^+^*;`C^!9lATTdb*X*fo)d-7|`Ez;qV?P!~Z3MS&b}XC&&Zi6o^ig&! zs4h%)UsieA-XEIwV}Xs}hQ;+5!1Oy7D$?A{uiVdGCmlUe^H$uz;M0_$jP`}dSNMQK z^uZ?MrD6o}Az{O8t8&Z4L)8u?){CB?TP`kdco9+Iu4-9#Jt*)B5q0|APCp@}e#Vjd zY0uJgKVV%gvMH%R0?|+3|y{=v4ej1bIa{T zC2<{*?tY+sK-`}p*=6LYj`p*~d%bxSNZNO|BRCtIbLKP(prd|l@jlEHumuw~LB^(w zZ^xTi{YE&lXQW?*g{GNU8ggV`&?@ZfuTtPoCiF%Y3MNwD9nmY3f8s^vF3J#hI6P+B zRDte9hGJ2nVv4a=RgQDjjgYST+{cGkfY2I;JpDOFHmhw$Hn9d7OHJa6*;xahF>jic zSOhC|`sAFzn#GE$NaM{^q^YTV(;-jk2rKH=d|LihrHXwo=w7OG_zyaNroLPM(w+xN zDgH(Q=VdpQ_7LmzJK+ZNBR{#rMC& zM$7AwfjMD3*z0MGBWBqy_ObRni4$L<`MOrPlA`6s+8&hH^I+Sf<(IddZgiK?!QIY@ zwN(YU8DnQN0|Lc=S9-wrPo=2@GnG`9J(a@8asO1>Iz=Uo_W3 z;zl=P7FhZ~C0N9#frs;&F`P1qje{c0V~Oe8FA*xVZ|z8_qK$FGQ%gc zZ%``ClZtazXvwyS&6;yOubD*KYAs@08G92M!=vTDt6LK{kW<}cYg@jc5kEBi?OYA>t<@PgqeE+IK!m$P5314=)#(y4SG& zrOS=sv|2I;dXRx)H6==>Fl8pV*eg*i#Up;UkD_L~na7sK@^b+f=X;LRh~oaG2RGFQ zK87vQvs+#mcTJ+R<7>nE;EqIkz=qJUq1*OwiS6kVEenD+xWz;a>*Wy!$RY(Kmm+Kx z?naPFZvaM~Vv2z3SC3*4HR6}?sFp>EX3q%*Je?Qc=x5&1K=H0J4^4o3)JrvQybL`; zFGtz3_;%!xiccN3d4YU1hEtEcMxRSqyUFuoD~#SN2;oI_-z3t9eIk%$0ykC17bh{} z)$b?U;@M4+0lqn4RzSig0?ilt4%eUwHtP_tR%AY8R4|E#mxxnbr2jTxej?E?ow!p%PC==_X4_w z;+nojdozWwP%rVet60|So`*7quqX$LPNUUJ&1TW%-M7C=44I__vEu6@il-`9cyZJFX)x5)$2M3 zt5ai+N0->N@Nwr)b#;BNN)OU`DY1f0T)~#9u#T*nEEn3Pb=1w}i|#DY0I&UAAtflo zfd(};UEA0|XPoVMFG&1&PgdNxo5Io=5dP4Uh)e1yndUug44t~Q5leTb__Y?Pg?wNO z4@+evSzMv(Ez#X@M2OGuy(x>kl>6vXo8>Uoojm@;OB(4(j4#S2ZvsKo31A}+OM#8N z|6KFiani?XK}99lFY?wp?FkR&rBp(X z=2)JlqR3YX9u13Zu%TTkbGJO0Lhdxzi!MW778s^(RNIKppuuIpGbVq!|7$b z7P4z+Q8-{@@BuAo35^dTr|PlnT@!TazmQfhY9Tfo-{0t3eWPCYc2K)Bec3Csl_Ig` z@=)!kijn4ux}CJ48%WWO(;@ZZfLBSFAhluGt#R-bt4IgOh1VlarmQLkNmg zlAq3rAo__2UvD2^U+mG5?6Tc5M}-Y7zpOuN8PB*)-(Xy~py}ufTv(6`^LtSLMiPSY z0x+9{R`hJ#(yA`uy#S0Y7{`JNoXVm=)<>%#H7Bc!8Mtn`oN=0nsOJ`F!5B1QC^RVO zxww^8gTt2r7}s|-7~R|xZkLS`onShPu@%3z_-e%Qllex4~C@@{7wkJ|`7|eV+40!6|9+*Wl-g`mAB2U$Ifr36hm1VBu^H2p`R?TAb*_P1i^CIY6EPjzER?i#T$SWp z7E(u8USCMS9#8*q#U^fN3FVT?RJ0%DqWP5PV9G8wkG#i;5sP{a3JpJXm^k{7vlLw@%ww+82ip*{DdG|m=PA3)NQzAOChDfh-%W}0`$HK43Pg9VN& z77N8$C=Ex$Bu2_3S-oxMOoCToOXuv;f~#B`R`Ok-_br|)$1Fc$j!9c9Jfas`e4@;S zkcgT!ZjNHjZ~gux=a-HPXSn`)xSWX6;8(dLFUHS|=f?W0yxtb^e?ELWd&cQk`^DPT zkGxXZ*}v9QD%2>O0$(=kwMo^5leq<3pcuhBW!|IW3(@+MK(Cdl21MWoeT6o7v&YLz zrU4PrR`m=r@YilSESVp7efe?_1TlBj36tD}FGFV`!wN^VtP)_LObsR#v*BQHVGA63 zAeaKom5T62q?TT@SKb>VM5qhH;j&aH!EXk@g zv{XSFMYAFPzLFjX5#SRs-h;wJj_Ic$D|OWL2=0SM>X6f6UYRE$n@M`Iw0}yF_iqiH?QQAqu(4supFsdC0b}1!rD^t%6O^ zZsO968+_HKwKkiG`g_4j(qioB?aLpT>g~ z+#llRCysnBzj5%7Z*b0|&n5@Em3zM=!mz&rHn)GlN$^FBTNzPR3IG_<a~rvI7uyFYvHkXI7ewHwMHANX(fZ{CYU z{OlLlJ7$zL3wAdcVgL7J*!@a-XCM9DhklSE{f{A~`_uPMn<34V*^O9GZ6|&IxTO6O zd$Ik$B}^IrNbDa{vtME_gG}Q4cf*kVkHlZJ|Ni{F;OyV|?I3Zuvx>jC<^B23_RyVw zH_?duPySxmc7OU__K}2u?#3sczktyFiF?sO5*oQ1)O>q!!QV{jztG?gD7jy2FRJ(V z|0D(fUafys_6zJq+DJs-ZcP4%z%JjnUu7>a^>-OR1OVW_z;OEo_MY@4u4*@?g#I}e a|58>)y5!)%2mqi1f0)5D$HtQM+y4NmxorXf literal 0 HcmV?d00001 diff --git a/docs/retailer-setup-guide.py b/docs/retailer-setup-guide.py new file mode 100644 index 0000000..182418a --- /dev/null +++ b/docs/retailer-setup-guide.py @@ -0,0 +1,133 @@ +from docx import Document +from docx.shared import Pt, Inches, RGBColor +from docx.enum.text import WD_ALIGN_PARAGRAPH + +doc = Document() + +for section in doc.sections: + section.top_margin = Inches(0.6) + section.bottom_margin = Inches(0.6) + section.left_margin = Inches(0.8) + section.right_margin = Inches(0.8) + +style = doc.styles['Normal'] +style.font.name = 'Calibri' +style.font.size = Pt(11) + +def heading(text, size=18, color=(0x1F, 0x3A, 0x5F), space_before=6, space_after=4): + p = doc.add_paragraph() + p.paragraph_format.space_before = Pt(space_before) + p.paragraph_format.space_after = Pt(space_after) + run = p.add_run(text) + run.bold = True + run.font.size = Pt(size) + run.font.color.rgb = RGBColor(*color) + return p + +def subheading(text): + return heading(text, size=13, color=(0x1F, 0x3A, 0x5F), space_before=8, space_after=2) + +def body(text, bold_lead=None): + p = doc.add_paragraph() + p.paragraph_format.space_after = Pt(4) + if bold_lead: + r = p.add_run(bold_lead) + r.bold = True + p.add_run(text) + else: + p.add_run(text) + return p + +def bullet(text, bold_lead=None): + p = doc.add_paragraph(style='List Bullet') + p.paragraph_format.space_after = Pt(2) + if bold_lead: + r = p.add_run(bold_lead) + r.bold = True + p.add_run(text) + else: + p.add_run(text) + return p + +# ---------- Title ---------- +title = doc.add_paragraph() +title.alignment = WD_ALIGN_PARAGRAPH.CENTER +tr = title.add_run('DoorCounter') +tr.bold = True +tr.font.size = Pt(28) +tr.font.color.rgb = RGBColor(0x1F, 0x3A, 0x5F) + +sub = doc.add_paragraph() +sub.alignment = WD_ALIGN_PARAGRAPH.CENTER +sr = sub.add_run('A simple, private way to count visitors to your store') +sr.italic = True +sr.font.size = Pt(13) +sr.font.color.rgb = RGBColor(0x55, 0x55, 0x55) +sub.paragraph_format.space_after = Pt(10) + +# ---------- What it is ---------- +heading('What is in the box?', size=14) +bullet('A small camera (about the size of a matchbox)', bold_lead='Camera — ') +bullet('A USB cable to power it', bold_lead='Cable — ') +bullet('A small wall plug', bold_lead='Power adapter — ') + +body('That\'s it. There is nothing to install on your computer or phone, no software to log into, and no monthly fee.') + +# ---------- What it does ---------- +heading('What does it do?', size=14) +body('The camera mounts above your front door, pointing straight down at the floor. Whenever someone walks underneath, it counts them. Once an hour, it sends the count to us so we can share visitor traffic reports with you.') + +p = doc.add_paragraph() +p.paragraph_format.space_after = Pt(4) +r = p.add_run('Your privacy is protected. ') +r.bold = True +p.add_run('The camera looks straight down at the top of people\'s heads — it cannot see faces. No video or photos are ever saved or sent anywhere. Only the count of how many people walked through.') + +# ---------- Setup ---------- +heading('How do I set it up?', size=14) +body('The whole process takes about 5 minutes. You will need a stepladder and your store\'s WiFi password.') + +subheading('Step 1 — Mount the camera above your door') +body('Use the included double-sided tape (or a screw, if you prefer) to stick the camera to the ceiling, directly above where people walk through your front door. The lens should point straight down at the floor. Aim for roughly 7 feet (about 2 meters) above the floor — most ceilings work fine.') + +subheading('Step 2 — Plug it in') +body('Connect the USB cable to the camera and to the wall plug. Plug the wall plug into any standard outlet. The camera will turn on automatically — you will see a small red light.') + +subheading('Step 3 — Connect it to your WiFi') +body('Take out your phone and open its WiFi settings. You will see a new network called "DoorCounter-Setup". Connect to it. Your phone will automatically open a setup page — enter your store\'s WiFi name and password, then tap Save.') +body('After about 30 seconds, the red light on the camera will turn off. That means it is connected and counting. You are done!', bold_lead='') + +# ---------- Day to day ---------- +heading('What do I do day-to-day?', size=14) +body('Nothing. The camera works on its own, 24 hours a day. It uses about as much electricity as a nightlight (less than $1 per year), runs cool, and never needs to be touched.') + +p = doc.add_paragraph() +p.paragraph_format.space_after = Pt(4) +r = p.add_run('A small light blinks each time someone walks through. ') +r.bold = True +p.add_run('You may notice the count happens 3–5 seconds after the person passes — that is normal.') + +# ---------- Troubleshooting ---------- +heading('If something seems wrong', size=14) +bullet('your WiFi password is probably wrong, or the WiFi network is out of range. Reconnect your phone to "DoorCounter-Setup" and re-enter the password.', bold_lead='Red light stays on — ') +bullet('unplug it for 10 seconds and plug it back in.', bold_lead='No light at all — ') +bullet('please contact us using the information below.', bold_lead='Anything else — ') + +# ---------- Contact ---------- +heading('Questions?', size=14) +body('We are happy to help. Reach out anytime:') +bullet('peter@research.bike', bold_lead='Email: ') +bullet('https://git.research.bike/Bicycle_Market_Research/DoorCounter', bold_lead='Project page: ') + +footer = doc.add_paragraph() +footer.alignment = WD_ALIGN_PARAGRAPH.CENTER +fr = footer.add_run('Thank you for participating in our retail traffic study.') +fr.italic = True +fr.font.size = Pt(10) +fr.font.color.rgb = RGBColor(0x77, 0x77, 0x77) +footer.paragraph_format.space_before = Pt(12) + +import sys +out = sys.argv[1] if len(sys.argv) > 1 else 'retailer-setup-guide.docx' +doc.save(out) +print(f"wrote {out}")