Browse Source

Merge branch 'release/1.2.0'

2015 1.2.0
Jérôme Loï 7 years ago
parent
commit
969b0707b4
  1. 1
      .gitignore
  2. 6
      README.md
  3. 17
      config-sample.js
  4. BIN
      html/assets/img/glyphicons-halflings-white.png
  5. BIN
      html/assets/img/glyphicons-halflings.png
  6. 79
      html/assets/img/squatconf.svg
  7. 79
      html/assets/img/squatconf_level.svg
  8. 165
      html/index.html
  9. 85
      html/verified.html
  10. 23
      package.json
  11. 0
      public/.empty-placeholder
  12. 0
      public/assets/css/bootstrap-responsive.css
  13. 0
      public/assets/css/bootstrap-responsive.min.css
  14. 0
      public/assets/css/bootstrap.css
  15. 0
      public/assets/css/bootstrap.min.css
  16. 0
      public/assets/css/fonts/Fixedsys500c.eot
  17. 0
      public/assets/css/fonts/Fixedsys500c.otf
  18. 0
      public/assets/css/fonts/Fixedsys500c.svg
  19. 0
      public/assets/css/fonts/Fixedsys500c.ttf
  20. 0
      public/assets/css/fonts/Fixedsys500c.woff
  21. 0
      public/assets/css/squatconf.css
  22. 0
      public/assets/img/squatconf_baguette.svg
  23. 0
      public/assets/js/bootstrap.js
  24. 0
      public/assets/js/bootstrap.min.js
  25. 542
      public/assets/js/email.js
  26. 0
      public/favicon.ico
  27. 237
      public/index.html
  28. 40
      server.js
  29. 56
      src/email-client.js
  30. 48
      src/email-confirm.js
  31. 81
      src/email-submit.js
  32. 8
      src/ip-trace.js
  33. 0
      src/mail.js
  34. 57
      src/newsletter.js
  35. 39
      src/newsletter/hnewsletter.js
  36. 2
      src/newsletter/mail.txt
  37. 27
      src/newsletter/newsletter.js
  38. 59
      src/newsletter/sq03.txt
  39. 69
      src/newsletter/squatconf-news-01.sh.txt
  40. 116
      src/newsletter/squatconf-news-02.hex
  41. 20
      src/rng.js

1
.gitignore

@ -19,3 +19,4 @@ html/assets/js/email*
/config.json
config.js
mails.txt

6
README.md

@ -1,7 +1,3 @@
# SquatConf website.
```cp config-sample.js config.js```
edit congif with the mailgun api key
```npm i && npm start```
```npm install && npm start```

17
config-sample.js

@ -1,17 +0,0 @@
var join = require('path').join
, name = 'squatconf'
, cwd = process.cwd()
module.exports = require('rc')(name, {
db_opts: { valueEncoding: 'json' }
, db_path: join(cwd, 'db', name)
, port: 8000
, host: 'http://test.squatconf.eu'
, mailjetKey: 'key-...'
, email: {
from : 'no-reply@squatconf.eu'
, subject : 'Hello, everyone is welcome at SquatConf..'
, bodyText : 'Please verify that you wish to signup by following this link\n%link%\nYou can ignore this message if you DID NOT request to signup at our website\nhttp://squatconf.eu\n\nThe next event is in Paris, we hope to see you there !!\n\nKind regards from the team,\nSquatConf Paris 2014'
}
})

BIN
html/assets/img/glyphicons-halflings-white.png

Before

Width: 469  |  Height: 159  |  Size: 8.6 KiB

BIN
html/assets/img/glyphicons-halflings.png

Before

Width: 469  |  Height: 159  |  Size: 12 KiB

79
html/assets/img/squatconf.svg

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="335"
height="328"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="squatconf.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.24980766"
inkscape:cx="437.80526"
inkscape:cy="-160.21562"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="681"
inkscape:window-height="766"
inkscape:window-x="683"
inkscape:window-y="0"
inkscape:window-maximized="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-192.92211,-54.377899)">
<g
id="logo"
inkscape:label="#g3257">
<path
inkscape:connector-curvature="0"
id="path3775"
d="m 348.91431,55.376724 c -0.52253,8.63486 -2.01839,13.36128 -1.49437,19.23183 -6.95049,-0.57945 -8.13741,7.14655 -8.44641,17.73747 6.81195,10.057006 0.40281,29.593966 1.10453,38.073836 0.6023,10.56967 -3.83221,28.92102 -3.31359,42.88179 -1.52816,13.43763 -1.52381,26.08525 -4.74299,39.24334 -0.63887,12.86918 -8.60767,6.60632 -12.99448,10.72045 4.31579,8.77011 2.34472,20.88609 -0.7147,28.9777 -1.47917,8.04585 -5.57077,12.7474 -10.72045,22.87029 3.22708,13.44272 -26.10841,1.87351 -12.86454,13.57923 -7.32348,-2.7117 0.11872,9.47284 -5.97746,13.83913 -7.89636,12.11782 -17.83244,23.41803 -25.72908,35.86477 -4.11494,13.20161 -18.31968,20.22231 -21.63581,33.33085 2.6847,1.63851 7.29061,0.35015 13.25437,1.03956 12.45996,2.52318 33.029,6.30881 30.34212,-13.12443 6.11269,-10.86519 11.15633,-21.82287 17.99736,-32.16134 10.63822,-8.79785 25.1122,-10.07994 37.87892,-12.27979 12.03466,-5.5931 24.17556,0.92477 35.28002,4.22321 12.47452,1.34421 24.07391,8.7173 34.04555,16.11316 8.61738,10.41579 12.50189,24.29432 17.08774,36.77438 13.79902,-2.72293 27.01869,1.28771 40.9976,2.14409 -1.20839,-11.04481 -14.08561,-20.80859 -19.36178,-31.51162 -3.86425,-5.49342 -7.1408,-10.91518 -12.47471,-15.33349 -6.83192,-5.28019 -10.07155,-13.63894 -16.30808,-19.29681 -14.56822,-2.57924 2.74827,-27.14508 -10.65547,-23.45504 11.42061,-7.79579 1.51372,-2.76148 -8.05658,-4.28818 -8.50814,-7.52854 -9.10167,-23.72447 -17.6725,-33.65571 -8.90315,-21.68615 11.61919,-21.7931 -9.16111,-27.80819 -5.0071,-7.61751 -4.71804,-20.98316 -8.7063,-31.18676 -1.04946,-10.86154 -1.71902,-26.57089 -3.3136,-36.31958 -1.1544,-9.14552 -9.82468,-51.08454 -4.02829,-58.280256 4.73274,-9.37087 1.36906,-19.58283 -7.92663,-18.842 0.0904,-2.73945 0.37859,-10.20826 -1.68928,-19.10189 z M 362.8184,241.2628 c 0.22182,-0.0231 0.40651,0.0166 0.51978,0.12995 3.71054,3.71053 3.29133,18.81973 5.97747,21.50587 1.31826,1.31826 2.45855,19.87118 7.14696,24.55957 0.0393,0.0393 2.16962,2.34701 3.57348,3.57348 0.69861,-0.099 1.23448,-0.0145 1.23448,0.58475 0,0.46622 -0.533,0.0281 -1.23448,-0.58475 -0.92651,0.1314 -2.12855,0.58475 -2.92375,0.58475 -4.23704,0 -7.53473,1.16951 -10.78543,1.16951 -8.28767,0 -17.23457,0.64972 -25.72907,0.64972 -2.32364,0 -10.88826,-1.06667 -12.53968,0.58475 -0.10541,0.10541 -2.40537,1.04441 -3.24862,1.49437 0.14741,-0.53633 -0.17589,-1.64342 0.25989,-2.07912 1.72887,-1.72887 2.2853,-4.05083 3.57348,-6.62719 0.64183,-1.28364 0.41011,-4.50334 1.23448,-5.32773 5.4549,-5.4549 10.08546,-37.97647 12.53968,-37.684 5.68725,1.13744 13.70086,0.58891 18.51713,-1.81923 0.22629,-0.11311 1.21872,-0.64565 1.8842,-0.7147 z m -38.00886,54.31694 c -0.0566,0.13431 -0.15032,0.19481 -0.32486,0.19481 -0.0869,0 0.12641,-0.0859 0.32486,-0.19481 z"
style="fill:#ff0000;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" />
<path
inkscape:connector-curvature="0"
id="path3820"
d="m 194.16939,320.30664 c -1.04251,-3.37343 1.57582,-4.12969 2.39109,-6.57546 4.23903,-12.7171 19.52486,-14.54459 29.88847,-19.72639 12.76196,-6.38098 23.68639,-13.07613 38.25726,-17.93309 2.96655,-0.98885 5.44679,-4.40595 8.36876,-5.37993 3.49751,-1.16582 6.89215,-3.14718 10.1621,-4.78216 1.58352,-0.79177 3.08036,-3.01935 4.78216,-3.58662 2.81196,-0.93731 5.45038,-3.21159 8.36876,-4.18439 12.73719,-4.24572 24.86379,-11.07751 38.25725,-15.542 5.13943,-1.71313 9.5612,-5.57813 14.34647,-7.17323 9.50521,-3.16841 20.1647,-5.12752 29.88848,-8.36878 5.25713,-1.75236 9.7964,-4.85952 14.94424,-6.57546 5.19922,-1.73307 10.7682,-2.24372 16.13979,-3.58662 7.25506,-1.81376 13.56917,-5.93282 20.92193,-7.77101 15.51107,-3.87776 31.71454,-6.28476 47.2238,-10.16208 4.63061,-1.15766 9.78528,-1.46844 14.34647,-2.98884 8.18715,-2.72907 26.58335,-11.67391 33.4751,-4.78216 3.59147,3.59147 -14.52979,11.41873 -16.13979,11.95539 -2.57697,0.85898 -4.4564,3.87655 -7.17323,4.78215 -4.21919,1.4064 -8.22453,7.72293 -11.9554,8.96655 -6.28709,2.09569 -12.45161,7.72022 -18.53086,10.75985 -1.03087,0.51545 -1.86214,2.01552 -2.98884,2.39109 -8.84666,2.94887 -16.52432,9.06266 -25.70408,11.35761 -13.29999,3.32499 -26.86627,6.96286 -40.05058,11.35762 -15.15013,5.05005 -31.09534,7.1789 -45.43048,14.34647 -3.03666,1.51834 -7.0549,0.75759 -10.16208,1.79332 -7.71492,2.57164 -14.50557,7.027 -22.11749,9.56431 -3.22658,1.07553 -7.71816,0.27247 -10.75984,1.79331 -4.09672,2.04834 -9.23623,4.47353 -13.74871,5.97769 -5.79747,1.93249 -12.66028,2.14577 -17.93307,4.78215 -9.00923,4.50462 -29.014,12.27644 -35.26842,18.53086 -0.0572,0.0572 -22.86586,6.94966 -25.70409,8.36878 -3.11853,1.55926 -5.54236,3.96671 -8.36878,5.37993 -0.79703,0.3985 -2.19182,-0.39853 -2.98883,0 -1.14131,0.57065 -8.11542,3.41441 -8.96655,2.98885 -3.4656,-1.7328 -3.36661,-4.21595 -7.77101,-5.97771 z"
style="fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" />
<path
inkscape:connector-curvature="0"
id="path3835"
d="m 348.32956,140.94539 c -10.66037,0.0817 -21.01707,3.54099 -30.66699,8.44641 -14.13764,7.70147 -28.24786,15.46487 -41.06256,25.2093 -9.79435,12.23394 -20.35165,22.98082 -30.40709,35.15008 -8.39427,12.32287 -10.19516,27.91568 -19.03692,40.08798 -6.47604,18.02401 -2.55054,38.07315 8.05658,53.66722 6.64885,13.94455 10.49089,30.08235 24.42963,39.04842 14.33692,7.06378 22.20514,25.56175 39.82809,25.85902 18.64854,3.95425 38.12109,19.02255 57.95539,10.20067 15.92752,-6.42788 33.25752,-0.89097 49.24909,-6.62719 18.84693,-3.48088 31.76493,-19.5138 43.27163,-33.52576 9.32092,-17.0039 19.95959,-33.52425 22.54543,-53.27739 7.06004,-19.76868 4.79746,-41.31532 -0.97458,-60.87915 1.87455,-16.52667 -9.73268,-28.30394 -19.68665,-39.37328 -9.96737,-12.23627 -26.39988,-15.8513 -36.31958,-28.13306 -15.52838,-12.30384 -37.10852,-14.62534 -56.39605,-14.74874 -3.60758,-0.78146 -7.23196,-1.13174 -10.78542,-1.10453 z m -5.45769,36.44953 c 11.26287,-0.24438 22.56115,3.39715 33.9156,2.98873 17.66435,1.23657 27.6653,9.90319 42.68688,20.85614 12.1618,11.59984 24.78173,31.7853 27.22344,49.18412 2.79795,16.75365 -0.78486,27.14271 -8.44641,41.32246 -3.50965,14.81853 -17.03803,23.21648 -23.58499,36.44952 -6.79996,12.87862 -20.97731,17.21368 -33.52576,22.22057 -18.84113,10.29754 -41.46785,4.56713 -59.44977,-4.74299 -21.02671,-4.07149 -41.4614,-16.01369 -53.40732,-34.17549 -5.44679,-14.87691 -9.88069,-30.45977 -11.76001,-46.26036 1.09172,-12.72698 4.85457,-25.63302 11.63006,-36.5145 4.65879,-11.01562 11.37851,-21.3445 21.63582,-27.93813 2.20673,-1.29758 4.61458,-2.33939 6.88707,-3.50851 11.05818,-7.14327 21.69079,-15.45681 34.95516,-18.06234 3.74537,-1.24331 7.48595,-1.73776 11.24023,-1.81922 z"
style="fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" />
</g>
</g>
</svg>

79
html/assets/img/squatconf_level.svg

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="357.50269"
height="327.22165"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="squatconf_level.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.70656276"
inkscape:cx="341.25813"
inkscape:cy="64.817473"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1364"
inkscape:window-height="766"
inkscape:window-x="127"
inkscape:window-y="458"
inkscape:window-maximized="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-181.90625,-55.15625)">
<g
id="logo"
inkscape:label="#g3170">
<path
inkscape:connector-curvature="0"
id="path3775"
d="m 348.91431,55.376724 c -0.52253,8.63486 -2.01839,13.36128 -1.49437,19.23183 -6.95049,-0.57945 -8.13741,7.14655 -8.44641,17.73747 6.81195,10.057006 0.40281,29.593966 1.10453,38.073836 0.6023,10.56967 -3.83221,28.92102 -3.31359,42.88179 -1.52816,13.43763 -1.52381,26.08525 -4.74299,39.24334 -0.63887,12.86918 -8.60767,6.60632 -12.99448,10.72045 4.31579,8.77011 2.34472,20.88609 -0.7147,28.9777 -1.47917,8.04585 -5.57077,12.7474 -10.72045,22.87029 3.22708,13.44272 -26.10841,1.87351 -12.86454,13.57923 -7.32348,-2.7117 0.11872,9.47284 -5.97746,13.83913 -7.89636,12.11782 -17.83244,23.41803 -25.72908,35.86477 -4.11494,13.20161 -18.31968,20.22231 -21.63581,33.33085 2.6847,1.63851 7.29061,0.35015 13.25437,1.03956 12.45996,2.52318 33.029,6.30881 30.34212,-13.12443 6.11269,-10.86519 11.15633,-21.82287 17.99736,-32.16134 10.63822,-8.79785 25.1122,-10.07994 37.87892,-12.27979 12.03466,-5.5931 24.17556,0.92477 35.28002,4.22321 12.47452,1.34421 24.07391,8.7173 34.04555,16.11316 8.61738,10.41579 12.50189,24.29432 17.08774,36.77438 13.79902,-2.72293 27.01869,1.28771 40.9976,2.14409 -1.20839,-11.04481 -14.08561,-20.80859 -19.36178,-31.51162 -3.86425,-5.49342 -7.1408,-10.91518 -12.47471,-15.33349 -6.83192,-5.28019 -10.07155,-13.63894 -16.30808,-19.29681 -14.56822,-2.57924 2.74827,-27.14508 -10.65547,-23.45504 11.42061,-7.79579 1.51372,-2.76148 -8.05658,-4.28818 -8.50814,-7.52854 -9.10167,-23.72447 -17.6725,-33.65571 -8.90315,-21.68615 11.61919,-21.7931 -9.16111,-27.80819 -5.0071,-7.61751 -4.71804,-20.98316 -8.7063,-31.18676 -1.04946,-10.86154 -1.71902,-26.57089 -3.3136,-36.31958 -1.1544,-9.14552 -9.82468,-51.08454 -4.02829,-58.280256 4.73274,-9.37087 1.36906,-19.58283 -7.92663,-18.842 0.0904,-2.73945 0.37859,-10.20826 -1.68928,-19.10189 z M 362.8184,241.2628 c 0.22182,-0.0231 0.40651,0.0166 0.51978,0.12995 3.71054,3.71053 3.29133,18.81973 5.97747,21.50587 1.31826,1.31826 2.45855,19.87118 7.14696,24.55957 0.0393,0.0393 2.16962,2.34701 3.57348,3.57348 0.69861,-0.099 1.23448,-0.0145 1.23448,0.58475 0,0.46622 -0.533,0.0281 -1.23448,-0.58475 -0.92651,0.1314 -2.12855,0.58475 -2.92375,0.58475 -4.23704,0 -7.53473,1.16951 -10.78543,1.16951 -8.28767,0 -17.23457,0.64972 -25.72907,0.64972 -2.32364,0 -10.88826,-1.06667 -12.53968,0.58475 -0.10541,0.10541 -2.40537,1.04441 -3.24862,1.49437 0.14741,-0.53633 -0.17589,-1.64342 0.25989,-2.07912 1.72887,-1.72887 2.2853,-4.05083 3.57348,-6.62719 0.64183,-1.28364 0.41011,-4.50334 1.23448,-5.32773 5.4549,-5.4549 10.08546,-37.97647 12.53968,-37.684 5.68725,1.13744 13.70086,0.58891 18.51713,-1.81923 0.22629,-0.11311 1.21872,-0.64565 1.8842,-0.7147 z m -38.00886,54.31694 c -0.0566,0.13431 -0.15032,0.19481 -0.32486,0.19481 -0.0869,0 0.12641,-0.0859 0.32486,-0.19481 z"
style="fill:#ff0000;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" />
<path
inkscape:connector-curvature="0"
id="path3820"
d="m 182.94575,267.22289 c 0.0253,-3.53076 2.74979,-3.46067 4.26585,-5.54586 7.88288,-10.84224 23.00656,-7.9664 34.45138,-9.77516 14.09338,-2.22736 26.53001,-5.30933 41.88736,-5.53739 3.12667,-0.0464 6.52335,-2.55457 9.60303,-2.6003 3.68629,-0.0547 7.52089,-0.91796 11.13199,-1.48867 1.74873,-0.27639 3.84859,-1.94768 5.64225,-1.97432 2.96374,-0.044 6.16595,-1.41493 9.24186,-1.46061 13.42469,-0.19935 27.04859,-3.0484 41.16498,-3.25803 5.41684,-0.0804 10.79964,-2.42899 15.8432,-2.5039 10.01827,-0.14878 20.77155,1.20395 31.02018,1.05176 5.54089,-0.0823 10.80675,-1.6729 16.23245,-1.75347 5.47985,-0.0814 10.94289,1.11426 16.46918,1.4569 7.46401,0.46279 14.72749,-1.55627 22.29201,-1.08726 15.9578,0.98943 32.13132,3.59007 48.08726,4.57936 4.76398,0.29537 9.77168,1.55637 14.57907,1.48498 8.62907,-0.12817 28.86799,-3.09744 33.35567,5.55433 2.33865,4.50866 -17.30054,6.49564 -18.99744,6.52083 -2.71607,0.0403 -5.4193,2.34911 -8.28278,2.39162 -4.44692,0.066 -10.17337,4.87739 -14.10562,4.93578 -6.62644,0.0984 -14.20213,3.59778 -20.91561,4.6588 -1.13842,0.17993 -2.38403,1.35878 -3.57155,1.37641 -9.32416,0.13846 -18.49009,3.6471 -27.93424,3.06156 -13.68304,-0.84839 -27.71445,-1.47896 -41.6104,-1.27261 -15.96788,0.23713 -31.81118,-2.55064 -47.64186,-0.0487 -3.35347,0.53 -6.95413,-1.40914 -10.22903,-1.36051 -8.13134,0.12076 -15.95068,2.31644 -23.97347,2.43558 -3.40074,0.0505 -7.43984,-2.07197 -10.79885,-1.5411 -4.52411,0.71499 -10.15614,1.47418 -14.91218,1.54481 -6.1104,0.0907 -12.71697,-1.77925 -18.53986,-0.859 -9.94914,1.5724 -31.36708,2.93751 -39.21876,7.01018 -0.0718,0.0373 -23.89697,-0.28298 -27.03131,0.21238 -3.44388,0.54427 -6.48176,2.10698 -9.60305,2.60029 -0.88018,0.13909 -1.96901,-1.04208 -2.84918,-0.90295 -1.26038,0.19919 -8.76773,0.80315 -9.45053,0.14034 -2.78018,-2.69881 -1.93564,-5.03603 -5.602,-8.04606 z"
style="fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" />
<path
inkscape:connector-curvature="0"
id="path3835"
d="m 348.32956,140.94539 c -10.66037,0.0817 -21.01707,3.54099 -30.66699,8.44641 -14.13764,7.70147 -28.24786,15.46487 -41.06256,25.2093 -9.79435,12.23394 -20.35165,22.98082 -30.40709,35.15008 -8.39427,12.32287 -10.19516,27.91568 -19.03692,40.08798 -6.47604,18.02401 -2.55054,38.07315 8.05658,53.66722 6.64885,13.94455 10.49089,30.08235 24.42963,39.04842 14.33692,7.06378 22.20514,25.56175 39.82809,25.85902 18.64854,3.95425 38.12109,19.02255 57.95539,10.20067 15.92752,-6.42788 33.25752,-0.89097 49.24909,-6.62719 18.84693,-3.48088 31.76493,-19.5138 43.27163,-33.52576 9.32092,-17.0039 19.95959,-33.52425 22.54543,-53.27739 7.06004,-19.76868 4.79746,-41.31532 -0.97458,-60.87915 1.87455,-16.52667 -9.73268,-28.30394 -19.68665,-39.37328 -9.96737,-12.23627 -26.39988,-15.8513 -36.31958,-28.13306 -15.52838,-12.30384 -37.10852,-14.62534 -56.39605,-14.74874 -3.60758,-0.78146 -7.23196,-1.13174 -10.78542,-1.10453 z m -5.45769,36.44953 c 11.26287,-0.24438 22.56115,3.39715 33.9156,2.98873 17.66435,1.23657 27.6653,9.90319 42.68688,20.85614 12.1618,11.59984 24.78173,31.7853 27.22344,49.18412 2.79795,16.75365 -0.78486,27.14271 -8.44641,41.32246 -3.50965,14.81853 -17.03803,23.21648 -23.58499,36.44952 -6.79996,12.87862 -20.97731,17.21368 -33.52576,22.22057 -18.84113,10.29754 -41.46785,4.56713 -59.44977,-4.74299 -21.02671,-4.07149 -41.4614,-16.01369 -53.40732,-34.17549 -5.44679,-14.87691 -9.88069,-30.45977 -11.76001,-46.26036 1.09172,-12.72698 4.85457,-25.63302 11.63006,-36.5145 4.65879,-11.01562 11.37851,-21.3445 21.63582,-27.93813 2.20673,-1.29758 4.61458,-2.33939 6.88707,-3.50851 11.05818,-7.14327 21.69079,-15.45681 34.95516,-18.06234 3.74537,-1.24331 7.48595,-1.73776 11.24023,-1.81922 z"
style="fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" />
</g>
</g>
</svg>

165
html/index.html

@ -1,165 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>SquatConf.386</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Squatconf webSite">
<link rel="icon" href="favicon.ico" type="image/x-icon" />
<link href="assets/css/bootstrap.css" rel="stylesheet">
<link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
<link href="assets/css/squatconf.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="span3 leftCol">
<ul class="nav nav-list">
<li><a href="#"><i class="icon-chevron-right"></i> SquatConf</a></li>
<li><a href="https://github.com/squatconf/organisation/blob/master/code_of_conduct.md#squatconf-code-of-conduct"><i class="icon-chevron-right"></i> Code of Conduct</a></li>
<li><a href="https://github.com/squatconf/talks#squatconf-call-for-papers"><i class="icon-chevron-right"></i> Submit a talk</a></li>
</ul>
<br />
<div class="formCont">
<form id="signup-form" method="GET" action="/email">
<fieldset>
<legend>JOIN US</legend>
<label class="text-info">Enter your email..</label>
<input type="text" name="email" class='input'>
<span class="help-block">we'll send you info about future events</span>
<!-- <label class="checkbox text-info">
<input type="checkbox" name="paris"> Paris Nov.2014?
</label> -->
<button type="submit" class="btn">Send</button>
<div id="status-msg">&nbsp;</div>
</fieldset>
</form>
</div>
<br />
<ul class="nav nav-list">
<li><a href="#">Chat with us in <br>#squatconf on freenode</a></li>
</ul>
<!-- <fieldset>
<legend>SUPPORT US</legend>
<ul class="nav nav-list">
<li>
<button type="submit" class="btn">Donate BTC</button>
</li>
</ul>
</fieldset> -->
</div>
<!-- content -->
<div class="span9">
<div class="page-header">
<pre class="maxW"><small>
.d8888b. 888 .d888
d88P Y88b 888 d88P"
Y88b. 888 888
"Y888b. .d88888888 888 8888b. 888888 .d8888b .d88b. 88888b. 888888
"Y88b.d88" 888888 888 "88b888 d88P" d88""88b888 "88b888
"888888 888888 888.d888888888 888 888 888888 888888
Y88b d88PY88b 888Y88b 888888 888Y88b. Y88b. Y88..88P888 888888
"Y8888P" "Y88888 "Y88888"Y888888 "Y888 "Y8888P "Y88P" 888 888888
888
888
888
</small></pre>
<pre class="dskW">
____ _ ____ __
/ ___| __ _ _ _ __ _| |_ / ___|___ _ __ / _|
\___ \ / _` | | | |/ _` | __| | / _ \| '_ \| |_
___) | (_| | |_| | (_| | |_| |__| (_) | | | | _|
|____/ \__, |\__,_|\__,_|\__|\____\___/|_| |_|_|
|_|
<br></pre>
<pre class="tblW">
__
(_ _ _ |_
__)(_||_|(_||_
|
__ _
/ _ _ (_
\__(_)| )|
<br></pre>
</div>
<div class="page-header"></div>
<div>
<h2 id="what-is-squatconf-">Why / What is SquatConf?</h2>
<p>
Squatconf is a tech conference that will happen... in a squat, hence the name.
it won't be a conference about squatting or squatters, but will also talk about technologies that can be used in squats. <br>
On top of that, the name sounded nice, isn't it ?
</p>
<p>It started because some of us are lucky enough to attend marvelous conventions, made with love by amazing people. Great events with top-notch speakers, incredible venues, and amazing parties.</p>
<p>These conferences are run with huge contributions from volunteers, and financial support from sponsors, providing top-notch events at affordable prices.</p>
<p>But even then, they're not affordable for everyone.</p>
<p>We're building an alternative model: SquatConf.</p>
<p>SquatConf won't be your everyday conference, but we'll have good talks from amazing people. It'll be donation-based, and you'll get to contribute if you want to.</p>
<h2 id="how-is-this-possible-">How is this possible?</h2>
<p>Conference costs are huge, and ticket prices are often <a href="http://2014.lxjs.org/about/">nowhere near the true per-attendee cost</a>, even for a non-profit conference.</p>
<p>Fancy venues, transportation, hotels and food are really nice perks to have, but…</p>
<p>If you hold a conference in a squat…
the speakers advance their travel expenses…
tell people to bring some food…
and the wifi will be dodgy for sure…</p>
<p>You'll have a zero-cost conference made with love, but a little rougher around the edges.</p>
<h2 id="where-and-when-">Where and when?</h2>
<p>November 15th 2014. A squat in Paris. For obvious reasons, we can't yet disclose where.</p>
<h2 id="the-plan">The Plan</h2>
<p>We are a bunch of crazy programmers that believe in anarchy and decentralised systems, conferences included.</p>
<p>We will provide a space, we will provide a context, some talks, and the rest will be up to you…</p>
<h2 id="who-is-behind-this-">Who is behind this?</h2>
<p>The inception of SquatConf was at <a href="http://2014.lxjs.org/">LXJS</a>. It was a great conference, and the organisation did an amazing job, and after the final day of the event we ended up with <a href="https://github.com/dominictarr">dominictarr</a>, <a href="https://github.com/joates">joates</a> and <a href="https://github.com/gorhgorh">I</a> talking about autonomous self-driving boats when this idea came to life. Now the idea matured and some folks (<a href="https://github.com/mmalecki">mmalecki</a>, <a href="https://github.com/nathan7">nathan7</a>, <a href="https://github.com/no9">no9</a>, <a href="https://github.com/substack">substack</a>, ...) are in the loop now.</p>
<h2 id="okay-so-you-re-a-bunch-of-idealists-running-a-10-people-conference-in-a-dump-">Okay, so you're a bunch of idealists, running a 10-people conference in a dump.</h2>
<p>What you'll get out of SquatConf is in the end exactly what you put into SquatConf.</p>
<ul>
<li>Tickets will be donation-based. You want a cheap conference? Give us nothing. You want food? Contribute.</li>
<li>This won't be a 400-people event, but do you <em>need</em> that many people?</li>
<li>We already have speakers lined up you're probably prepared to pay for :)</li>
<li>You have ideas for improvements? Suggestions are always welcome.</li>
<li>We plan to make SquatConf zero-sum. We'll split any profits with attendees — ROI on a conference!</li>
</ul>
<!-- <h2 id="i-want-to-give-a-talk-">I want to give a talk!</h2>
<p>Please see <a href="https://github.com/squatconf/talks">our talks repository</a> to propose a talk.</p> -->
</div>
</div>
</div>
</div>
<div class="parisCont">
<div class="container">
<div class="row">
<div class="span3"></div>
<div class="span9">
<div id="logo-wrapper">
<div id="logoCont"></div>
<div class="attribution">logo image by <a href="http://substack.net">substack</a></div>
</div>
</div>
</div>
</div>
</div>
<script src="assets/js/email.js"></script>
<script>
(function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
e=o.createElement(i);r=o.getElementsByTagName(i)[0];
e.src='//www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
ga('create','UA-8478831-9','auto');ga('send','pageview');
</script>
</body>
</html>

85
html/verified.html

@ -1,85 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>SquatConf.386</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Squatconf webSite">
<link href="assets/css/bootstrap.css" rel="stylesheet">
<link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
<link href="assets/css/squatconf.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="span3 leftCol">
<ul class="nav nav-list">
<li><a href="/"><i class="icon-chevron-right"></i> SquatConf</a></li>
</ul>
</div>
<!-- content -->
<div class="span9">
<div class="page-header">
<pre class="maxW"><small>
.d8888b. 888 .d888
d88P Y88b 888 d88P"
Y88b. 888 888
"Y888b. .d88888888 888 8888b. 888888 .d8888b .d88b. 88888b. 888888
"Y88b.d88" 888888 888 "88b888 d88P" d88""88b888 "88b888
"888888 888888 888.d888888888 888 888 888888 888888
Y88b d88PY88b 888Y88b 888888 888Y88b. Y88b. Y88..88P888 888888
"Y8888P" "Y88888 "Y88888"Y888888 "Y888 "Y8888P "Y88P" 888 888888
888
888
888
<br></small></pre>
<pre class="dskW">
____ _ ____ __
/ ___| __ _ _ _ __ _| |_ / ___|___ _ __ / _|
\___ \ / _` | | | |/ _` | __| | / _ \| '_ \| |_
___) | (_| | |_| | (_| | |_| |__| (_) | | | | _|
|____/ \__, |\__,_|\__,_|\__|\____\___/|_| |_|_|
|_|
<br></pre>
<pre class="tblW">
(~ _ _ _|_/~` _ _ |`
_)(_||_|(_| | \_,(_)| |~|~
|/
<br></pre>
</div>
<div>
<h2 id="email-verified" class="pull-left">You're verified</h2>
<br /><br />
<p>Thanks for completing our signup process</p>
<br />
<a href="/" class="btn">Go back</a>
</div>
</div>
</div>
</div>
<!-- Footer
================================================== -->
<!-- <footer class="footer">
<div class="container">
some info, maybe ? ;)
</div>
</footer> -->
</body>
<script>
(function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
e=o.createElement(i);r=o.getElementsByTagName(i)[0];
e.src='//www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
ga('create','UA-8478831-9','auto');ga('send','pageview');
</script>
</html>

23
package.json

@ -1,20 +1,16 @@
{
"name": "squatconf-web",
"version": "1.1.1",
"version": "1.2.0",
"description": "website for the squatConf conference",
"main": "server.js",
"scripts": {
"start": "echo -n 'building.. '; npm run build && node server.js",
"build": "browserify src/email-client.js -o html/assets/js/email.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/squatconf/website.git"
},
"keywords": [
"squatconf",
"web"
"www",
"website"
],
"author": "squatconf",
"license": "ISC",
@ -23,17 +19,6 @@
},
"homepage": "https://github.com/squatconf/website",
"dependencies": {
"browserify": "^5.11.2",
"domready": "^1.0.7",
"ecstatic": "^0.5.4",
"level": "^0.18.0",
"load-svg": "^1.0.0",
"mailcomposer": "^0.2.12",
"mailgun-js": "^0.6.7",
"rc": "^0.5.1",
"stack": "^0.1.0",
"tiny-route": "^2.1.1",
"valid-email": "0.0.1",
"xss-escape": "0.0.5"
"ecstatic": "^0.5.8"
}
}

0
html/.empty-placeholder → public/.empty-placeholder

0
html/assets/css/bootstrap-responsive.css → public/assets/css/bootstrap-responsive.css

0
html/assets/css/bootstrap-responsive.min.css → public/assets/css/bootstrap-responsive.min.css

0
html/assets/css/bootstrap.css → public/assets/css/bootstrap.css

0
html/assets/css/bootstrap.min.css → public/assets/css/bootstrap.min.css

0
html/assets/css/fonts/Fixedsys500c.eot → public/assets/css/fonts/Fixedsys500c.eot

0
html/assets/css/fonts/Fixedsys500c.otf → public/assets/css/fonts/Fixedsys500c.otf

0
html/assets/css/fonts/Fixedsys500c.svg → public/assets/css/fonts/Fixedsys500c.svg

0
html/assets/css/fonts/Fixedsys500c.ttf → public/assets/css/fonts/Fixedsys500c.ttf

0
html/assets/css/fonts/Fixedsys500c.woff → public/assets/css/fonts/Fixedsys500c.woff

0
html/assets/css/squatconf.css → public/assets/css/squatconf.css

0
html/assets/img/squatconf_baguette.svg → public/assets/img/squatconf_baguette.svg

0
html/assets/js/bootstrap.js → public/assets/js/bootstrap.js

0
html/assets/js/bootstrap.min.js → public/assets/js/bootstrap.min.js

542
public/assets/js/email.js

@ -0,0 +1,542 @@
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"/Users/jloi/code/Squatconf/website/node_modules/domready/ready.js":[function(require,module,exports){
/*!
* domready (c) Dustin Diaz 2014 - License MIT
*/
!function (name, definition) {
if (typeof module != 'undefined') module.exports = definition()
else if (typeof define == 'function' && typeof define.amd == 'object') define(definition)
else this[name] = definition()
}('domready', function () {
var fns = [], listener
, doc = document
, hack = doc.documentElement.doScroll
, domContentLoaded = 'DOMContentLoaded'
, loaded = (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState)
if (!loaded)
doc.addEventListener(domContentLoaded, listener = function () {
doc.removeEventListener(domContentLoaded, listener)
loaded = 1
while (listener = fns.shift()) listener()
})
return function (fn) {
loaded ? fn() : fns.push(fn)
}
});
},{}],"/Users/jloi/code/Squatconf/website/node_modules/load-svg/index.js":[function(require,module,exports){
var xhr = require('xhr');
module.exports = function (opts, cb) {
if (typeof opts === 'string') opts = { uri: opts };
xhr(opts, function (err, res, body) {
if (err) return cb(err);
if (!/^2/.test(res.statusCode)) {
return cb(new Error('http status code: ' + res.statusCode));
}
var div = document.createElement('div');
div.innerHTML = body;
var svg = div.querySelector('svg');
if (!svg) return cb(new Error('svg not present in resource'));
cb(null, svg);
});
};
},{"xhr":"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/index.js"}],"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/index.js":[function(require,module,exports){
var window = require("global/window")
var once = require("once")
var parseHeaders = require('parse-headers')
var messages = {
"0": "Internal XMLHttpRequest Error",
"4": "4xx Client Error",
"5": "5xx Server Error"
}
var XHR = window.XMLHttpRequest || noop
var XDR = "withCredentials" in (new XHR()) ? XHR : window.XDomainRequest
module.exports = createXHR
function createXHR(options, callback) {
if (typeof options === "string") {
options = { uri: options }
}
options = options || {}
callback = once(callback)
var xhr = options.xhr || null
if (!xhr) {
if (options.cors || options.useXDR) {
xhr = new XDR()
}else{
xhr = new XHR()
}
}
var uri = xhr.url = options.uri || options.url
var method = xhr.method = options.method || "GET"
var body = options.body || options.data
var headers = xhr.headers = options.headers || {}
var sync = !!options.sync
var isJson = false
var key
var load = options.response ? loadResponse : loadXhr
if ("json" in options) {
isJson = true
headers["Accept"] = "application/json"
if (method !== "GET" && method !== "HEAD") {
headers["Content-Type"] = "application/json"
body = JSON.stringify(options.json)
}
}
xhr.onreadystatechange = readystatechange
xhr.onload = load
xhr.onerror = error
// IE9 must have onprogress be set to a unique function.
xhr.onprogress = function () {
// IE must die
}
// hate IE
xhr.ontimeout = noop
xhr.open(method, uri, !sync)
//backward compatibility
if (options.withCredentials || (options.cors && options.withCredentials !== false)) {
xhr.withCredentials = true
}
// Cannot set timeout with sync request
if (!sync) {
xhr.timeout = "timeout" in options ? options.timeout : 5000
}
if (xhr.setRequestHeader) {
for(key in headers){
if(headers.hasOwnProperty(key)){
xhr.setRequestHeader(key, headers[key])
}
}
} else if (options.headers) {
throw new Error("Headers cannot be set on an XDomainRequest object")
}
if ("responseType" in options) {
xhr.responseType = options.responseType
}
if ("beforeSend" in options &&
typeof options.beforeSend === "function"
) {
options.beforeSend(xhr)
}
xhr.send(body)
return xhr
function readystatechange() {
if (xhr.readyState === 4) {
load()
}
}
function getBody() {
// Chrome with requestType=blob throws errors arround when even testing access to responseText
var body = null
if (xhr.response) {
body = xhr.response
} else if (xhr.responseType === 'text' || !xhr.responseType) {
body = xhr.responseText || xhr.responseXML
}
if (isJson) {
try {
body = JSON.parse(body)
} catch (e) {}
}
return body
}
function getStatusCode() {
return xhr.status === 1223 ? 204 : xhr.status
}
// if we're getting a none-ok statusCode, build & return an error
function errorFromStatusCode(status) {
var error = null
if (status === 0 || (status >= 400 && status < 600)) {
var message = (typeof body === "string" ? body : false) ||
messages[String(status).charAt(0)]
error = new Error(message)
error.statusCode = status
}
return error
}
// will load the data & process the response in a special response object
function loadResponse() {
var status = getStatusCode()
var error = errorFromStatusCode(status)
var response = {
body: getBody(),
statusCode: status,
statusText: xhr.statusText,
raw: xhr
}
if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
response.headers = parseHeaders(xhr.getAllResponseHeaders())
} else {
response.headers = {}
}
callback(error, response, response.body)
}
// will load the data and add some response properties to the source xhr
// and then respond with that
function loadXhr() {
var status = getStatusCode()
var error = errorFromStatusCode(status)
xhr.status = xhr.statusCode = status
xhr.body = getBody()
xhr.headers = parseHeaders(xhr.getAllResponseHeaders())
callback(error, xhr, xhr.body)
}
function error(evt) {
callback(evt, xhr)
}
}
function noop() {}
},{"global/window":"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/global/window.js","once":"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/once/once.js","parse-headers":"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/parse-headers/parse-headers.js"}],"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/global/window.js":[function(require,module,exports){
(function (global){
if (typeof window !== "undefined") {
module.exports = window;
} else if (typeof global !== "undefined") {
module.exports = global;
} else {
module.exports = {};
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/once/once.js":[function(require,module,exports){
module.exports = once
once.proto = once(function () {
Object.defineProperty(Function.prototype, 'once', {
value: function () {
return once(this)
},
configurable: true
})
})
function once (fn) {
var called = false
return function () {
if (called) return
called = true
return fn.apply(this, arguments)
}
}
},{}],"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/parse-headers/node_modules/for-each/index.js":[function(require,module,exports){
var isFunction = require('is-function')
module.exports = forEach
var toString = Object.prototype.toString
var hasOwnProperty = Object.prototype.hasOwnProperty
function forEach(list, iterator, context) {
if (!isFunction(iterator)) {
throw new TypeError('iterator must be a function')
}
if (arguments.length < 3) {
context = this
}
if (toString.call(list) === '[object Array]')
forEachArray(list, iterator, context)
else if (typeof list === 'string')
forEachString(list, iterator, context)
else
forEachObject(list, iterator, context)
}
function forEachArray(array, iterator, context) {
for (var i = 0, len = array.length; i < len; i++) {
if (hasOwnProperty.call(array, i)) {
iterator.call(context, array[i], i, array)
}
}
}
function forEachString(string, iterator, context) {
for (var i = 0, len = string.length; i < len; i++) {
// no such thing as a sparse string.
iterator.call(context, string.charAt(i), i, string)
}
}
function forEachObject(object, iterator, context) {
for (var k in object) {
if (hasOwnProperty.call(object, k)) {
iterator.call(context, object[k], k, object)
}
}
}
},{"is-function":"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/parse-headers/node_modules/for-each/node_modules/is-function/index.js"}],"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/parse-headers/node_modules/for-each/node_modules/is-function/index.js":[function(require,module,exports){
module.exports = isFunction
var toString = Object.prototype.toString
function isFunction (fn) {
var string = toString.call(fn)
return string === '[object Function]' ||
(typeof fn === 'function' && string !== '[object RegExp]') ||
(typeof window !== 'undefined' &&
// IE8 and below
(fn === window.setTimeout ||
fn === window.alert ||
fn === window.confirm ||
fn === window.prompt))
};
},{}],"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/parse-headers/node_modules/trim/index.js":[function(require,module,exports){
exports = module.exports = trim;
function trim(str){
return str.replace(/^\s*|\s*$/g, '');
}
exports.left = function(str){
return str.replace(/^\s*/, '');
};
exports.right = function(str){
return str.replace(/\s*$/, '');
};
},{}],"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/parse-headers/parse-headers.js":[function(require,module,exports){
var trim = require('trim')
, forEach = require('for-each')
, isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
}
module.exports = function (headers) {
if (!headers)
return {}
var result = {}
forEach(
trim(headers).split('\n')
, function (row) {
var index = row.indexOf(':')
, key = trim(row.slice(0, index)).toLowerCase()
, value = trim(row.slice(index + 1))
if (typeof(result[key]) === 'undefined') {
result[key] = value
} else if (isArray(result[key])) {
result[key].push(value)
} else {
result[key] = [ result[key], value ]
}
}
)
return result
}
},{"for-each":"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/parse-headers/node_modules/for-each/index.js","trim":"/Users/jloi/code/Squatconf/website/node_modules/load-svg/node_modules/xhr/node_modules/parse-headers/node_modules/trim/index.js"}],"/Users/jloi/code/Squatconf/website/node_modules/valid-email/index.js":[function(require,module,exports){
module.exports = require('./lib/valid-email');
},{"./lib/valid-email":"/Users/jloi/code/Squatconf/website/node_modules/valid-email/lib/valid-email.js"}],"/Users/jloi/code/Squatconf/website/node_modules/valid-email/lib/valid-email.js":[function(require,module,exports){
/*!
* Valid Email
* Copyright(c) 2013 John Henry
* MIT Licensed
*/
/**
* Valid-Email:
*
* An alternative to using a regular expression to validate email.
* Inspired by:
* http://stackoverflow.com/questions/997078/email-regular-expression
* http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address
*
* Examples:
* console.log(require('valid-email')('john@iamjohnhenry.com'))//#true
* console.log(require('valid-email')('iamjohnhenry.com'))//#false
*
* @param {String} email
* // potential email address
* @return {Boolean}
* @api public
*/
module.exports = function valid(email){
var at = email.search("@");
if (at <0) return false;
var user = email.substr(0, at);
var domain = email.substr(at+1);
var userLen = user.length;
var domainLen = domain.length;
if (userLen < 1 || userLen > 64) return false;// user part length exceeded
if (domainLen < 1 || domainLen > 255) return false;// domain part length exceeded
if (user.charAt(0) === '.' || user.charAt(userLen-1) === '.') return false;// user part starts or ends with '.'
if (user.match(/\.\./)) return false;// user part has two consecutive dots
if (!domain.match(/^[A-Za-z0-9.-]+$/)) return false;// character not valid in domain part
if (domain.match( /\\.\\./)) return false;// domain part has two consecutive dots
if (!user.replace("\\\\","").match(/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/)) if (!user.replace("\\\\","").match(/^"(\\\\"|[^"])+"$/)) return false
return true;
}
},{}],"/Users/jloi/code/Squatconf/website/src/email-client.js":[function(require,module,exports){
(function (process){
var ready = require('domready')
, check_email = require('valid-email')
, loadsvg = require('load-svg')
process.nextTick(function() {
ready(function() {
var form = document.getElementById('signup-form')
, input_email = ''
, status_msg = document.getElementById('status-msg')
, logoCont = document.getElementById('logoCont')
loadsvg('/assets/img/squatconf_baguette.svg', function (err, svg) {
logoCont.appendChild(svg);
});
for (var n = 0, l = form.childNodes[1].childNodes.length; n < l; n++) {
var el = form.childNodes[1].childNodes[n]
if (el.nodeName === 'INPUT' && el.name === 'email')
input_email = el
}
document
.getElementById("signup-form")
.addEventListener("click", function(e) {
if (e.srcElement.nodeName === 'BUTTON') {
if (input_email && input_email.value) {
var is_valid = check_email(input_email.value)
if (is_valid) {
var progress = 0
, timerID = null
e.preventDefault()
status_msg.className = 'info'
status_msg.innerHTML = "Sending"
timerID = setInterval(function() {
if (++progress < 8) {
status_msg.innerHTML += "."
} else {
clearInterval(timerID)
form.submit()
}
}, 150)
} else {
e.preventDefault()
input_email.value = ''
status_msg.className = 'error'
status_msg.innerHTML = "that doesn't look like an email address,"
+ "<br />please try again..."
setTimeout(function() { status_msg.innerHTML = '&nbsp;' }, 2000)
}
}
}
})
})
})
}).call(this,require('_process'))
},{"_process":"/usr/local/lib/node_modules/watchify/node_modules/browserify/node_modules/process/browser.js","domready":"/Users/jloi/code/Squatconf/website/node_modules/domready/ready.js","load-svg":"/Users/jloi/code/Squatconf/website/node_modules/load-svg/index.js","valid-email":"/Users/jloi/code/Squatconf/website/node_modules/valid-email/index.js"}],"/usr/local/lib/node_modules/watchify/node_modules/browserify/node_modules/process/browser.js":[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};
process.nextTick = (function () {
var canSetImmediate = typeof window !== 'undefined'
&& window.setImmediate;
var canPost = typeof window !== 'undefined'
&& window.postMessage && window.addEventListener
;
if (canSetImmediate) {
return function (f) { return window.setImmediate(f) };
}
if (canPost) {
var queue = [];
window.addEventListener('message', function (ev) {
var source = ev.source;
if ((source === window || source === null) && ev.data === 'process-tick') {
ev.stopPropagation();
if (queue.length > 0) {
var fn = queue.shift();
fn();
}
}
}, true);
return function nextTick(fn) {
queue.push(fn);
window.postMessage('process-tick', '*');
};
}
return function nextTick(fn) {
setTimeout(fn, 0);
};
})();
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
}
// TODO(shtylman)
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
},{}]},{},["/Users/jloi/code/Squatconf/website/src/email-client.js"]);

0
html/favicon.ico → public/favicon.ico

237
public/index.html

@ -0,0 +1,237 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>SquatConf.386</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Squatconf webSite">
<link rel="icon" href="favicon.ico" type="image/x-icon" />
<link href="assets/css/bootstrap.css" rel="stylesheet">
<link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
<link href="assets/css/squatconf.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="span3 leftCol">
<!-- <ul class="nav nav-list">
<li><a href="#"><i class="icon-chevron-right"></i> SquatConf</a></li>
<li><a href="https://github.com/squatconf/organisation/blob/master/code_of_conduct.md#squatconf-code-of-conduct"><i class="icon-chevron-right"></i> Code of Conduct</a></li>
<li><a href="https://github.com/squatconf/talks#squatconf-call-for-papers"><i class="icon-chevron-right"></i> Submit a talk</a></li>
</ul> -->
<!-- <br /> -->
<div class="formCont">
<fieldset>
<legend>JOIN US</legend>
<label class="text-info">Squatconf's mailing list</label>
<!-- <label class="checkbox text-info">
<input type="checkbox" name="paris"> Paris Nov.2014?
</label> -->
<a href="https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/squatconf"><button type="submit" class="btn">Subscribe</button></a>
<div id="status-msg">&nbsp;</div>
<span class="help-block">we'll send you info about future events, and talk about all and nothing</span>
</fieldset>
</form>
</div>
<br />
<ul class="nav nav-list">
<li><a href="https://twitter.com/squatconf">@squatconf</a>
</ul>
<br>
<ul class="nav nav-list">
<li><a href="#">#squatconf on freenode</a></li>
</ul>
<br>
<!-- <fieldset>
<legend>SUPPORT US</legend>
<ul class="nav nav-list">
<li>
<button type="submit" class="btn">Donate BTC</button>
</li>
</ul>
</fieldset> -->
</div>
<!-- content -->
<div class="span9">
<div class="page-header">
<pre class="maxW"><small>
.d8888b. 888 .d888
d88P Y88b 888 d88P"
Y88b. 888 888
"Y888b. .d88888888 888 8888b. 888888 .d8888b .d88b. 88888b. 888888
"Y88b.d88" 888888 888 "88b888 d88P" d88""88b888 "88b888
"888888 888888 888.d888888888 888 888 888888 888888
Y88b d88PY88b 888Y88b 888888 888Y88b. Y88b. Y88..88P888 888888
"Y8888P" "Y88888 "Y88888"Y888888 "Y888 "Y8888P "Y88P" 888 888888
888
888
888
</small></pre>
<pre class="dskW">
____ _ ____ __
/ ___| __ _ _ _ __ _| |_ / ___|___ _ __ / _|
\___ \ / _` | | | |/ _` | __| | / _ \| '_ \| |_
___) | (_| | |_| | (_| | |_| |__| (_) | | | | _|
|____/ \__, |\__,_|\__,_|\__|\____\___/|_| |_|_|
|_|
<br></pre>
<pre class="tblW">
__
(_ _ _ |_
__)(_||_|(_||_
|
__ _
/ _ _ (_
\__(_)| )|
<br></pre>
</div>
<div class="page-header">
<h1>Squatconf will never stop !</h1><br>
<p>
thanks to all of you for attenting/helping/participate.
<br>
We had a blast making this, and will make more soon !</p>
<p>
subscribe to the mailing list if you want more infos or help making the next events.
</p>
<p>
I'm terrible at writting, but <a href="https://twitter.com/olizilla">@Olizilla</a> wrote something that sum up what happened pretty well <a href="http://blog.tableflip.io/squatconf-information-wants-to-be-free/">here</a>
</p>
</div>
<div>
<h2 id="what-is-squatconf-">Why / What is SquatConf?</h2>
<p>
Squatconfs are tech conference that happen... in squats, hence the name. <br>
It is not a conference about squatting or squatters, but will also talk about technologies that can be used in squats. <br>
On top of that, the name sounded nice, isn't it ?
</p>
<p>
It started because some of us are lucky enough to attend marvelous conventions, made with love by amazing people. Great events with top-notch speakers, incredible venues, and amazing parties.
</p>
<p>
These conferences are run with huge contributions from volunteers, and financial support from sponsors, providing top-notch events at affordable prices.
</p>
<p>
But even then, they're not affordable for everyone.
</p>
<p>
We're building an alternative model: SquatConf.
</p>
<p>
SquatConf won't be your everyday conference, but we'll have good talks from amazing people. It'll be donation-based, and you'll get to contribute if you want to.
</p>
<h2 id="how-is-this-possible-">How is this possible?</h2>
<p>
Conference costs are huge, and ticket prices are often <a href="http://2014.lxjs.org/about/">nowhere near the true per-attendee cost</a>, even for a non-profit conference.
</p>
<p>
Fancy venues, transportation, hotels and food are really nice perks to have, but…
</p>
<p>
If you hold a conference in a squat…
the speakers advance their travel expenses…
tell people to bring some food…
and the wifi will be dodgy for sure…
</p>
<p>You'll have a zero-cost conference made with love, but a little rougher around the edges.</p>
<h2 id="where-and-when-">Where and when?</h2>
<div>
past
<ul>
<li>14/11/15 : Le hangard56</li>
</ul>
</div>
<br>
<div>
future
<ul>
<li>???</li>
</ul>
</div>
<h2 id="the-plan">The Plan</h2>
<p>We are a bunch of crazy programmers that believe in anarchy and decentralised systems, conferences included.</p>
<p>We will provide a space, we will provide a context, some talks, and the rest will be up to you…</p>
<h2 id="who-is-behind-this-">Who is behind this?</h2>
<p>You, amongst other crazy ppl</p>
<h2 id="okay-so-you-re-a-bunch-of-idealists-running-a-10-people-conference-in-a-dump-">Okay, so you're a bunch of idealists, running a 10-people conference in a dump.</h2>
<p>What you'll get out of SquatConf is in the end exactly what you put into SquatConf.</p>
<ul>
<li>Tickets will be donation-based. You want a cheap conference? Give us nothing. You want food? Contribute.</li>
<li>This won't be a 400-people event, but do you <em>need</em> that many people?</li>
<li>We already have speakers lined up you're probably prepared to pay for :)</li>
<li>You have ideas for improvements? Suggestions are always welcome.</li>
<li>We plan to make SquatConf zero-sum. We'll split any profits with attendees — ROI on a conference!</li>
</ul>
<!-- <h2 id="i-want-to-give-a-talk-">I want to give a talk!</h2>
<p>Please see <a href="https://github.com/squatconf/talks">our talks repository</a> to propose a talk.</p> -->
</div>
</div>
</div>
</div>
<div class="parisCont">
<div class="container">
<div class="row">
<div class="span3"></div>
<div class="span9">
<div id="logo-wrapper">
<div id="logoCont">
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="335" height="328" id="svg3956" version="1.1" inkscape:version="0.48.2 r9819" sodipodi:docname="squatconf_baguette.svg.2014_09_22_22_27_31.0.svg">
<defs id="defs3958"></defs>
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.80800781" inkscape:cx="150.80201" inkscape:cy="176.63891" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="681" inkscape:window-height="766" inkscape:window-x="651" inkscape:window-y="301" inkscape:window-maximized="0" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0"></sodipodi:namedview>
<metadata id="metadata3961">
<rdf:rdf>
<cc:work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"></dc:type>
<dc:title></dc:title>
</cc:work>
</rdf:rdf>
</metadata>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(-214.29711,-324.79959)">
<g id="logo" inkscape:label="#g3121">
<path style="fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" d="m 369.71888,411.36916 c -10.66036,0.0817 -21.01707,3.54098 -30.66698,8.44641 -14.13765,7.70147 -28.24787,15.46487 -41.06257,25.2093 -9.79435,12.23394 -20.35165,22.98081 -30.40709,35.15007 -8.39427,12.32287 -10.19516,27.91569 -19.03692,40.08799 -6.47603,18.02401 -2.55053,38.07315 8.05658,53.66721 6.64885,13.94456 10.4909,30.08235 24.42963,39.04842 14.33693,7.06378 22.20514,25.56175 39.82809,25.85902 18.64854,3.95426 38.1211,19.02256 57.9554,10.20067 15.92751,-6.42788 33.25752,-0.89096 49.24909,-6.62718 18.84688,-3.48088 31.76488,-19.51381 43.27158,-33.52577 9.321,-17.00389 19.9596,-33.52425 22.5455,-53.27738 7.06,-19.76868 4.7974,-41.31533 -0.9746,-60.87915 1.8746,-16.52668 -9.7327,-28.30394 -19.6867,-39.37329 -9.9673,-12.23627 -26.3998,-15.85129 -36.31953,-28.13305 -15.52839,-12.30385 -37.10853,-14.62535 -56.39606,-14.74874 -3.60758,-0.78146 -7.23196,-1.13175 -10.78542,-1.10453 z m -5.45768,36.44952 c 11.26286,-0.24438 22.56114,3.39715 33.9156,2.98873 17.66434,1.23658 27.66529,9.90319 42.68689,20.85615 12.1618,11.59983 24.7817,31.78529 27.2234,49.18412 2.798,16.75365 -0.7848,27.14271 -8.4464,41.32245 -3.5096,14.81854 -17.038,23.21649 -23.58497,36.44953 -6.79997,12.87861 -20.97732,17.21368 -33.52577,22.22057 -18.84113,10.29753 -41.46785,4.56713 -59.44976,-4.74299 -21.02672,-4.07149 -41.46141,-16.0137 -53.40733,-34.17549 -5.44679,-14.87692 -9.88069,-30.45978 -11.76001,-46.26036 1.09173,-12.72699 4.85458,-25.63302 11.63007,-36.5145 4.65878,-11.01562 11.37851,-21.34451 21.63581,-27.93814 2.20673,-1.29758 4.61458,-2.33938 6.88708,-3.50851 11.05818,-7.14326 21.69078,-15.4568 34.95516,-18.06233 3.74536,-1.24331 7.48594,-1.73777 11.24023,-1.81923 z" id="path3878-0" inkscape:connector-curvature="0"></path>
<path style="fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" d="m 370.30363,325.80049 c -0.52252,8.63487 -2.01839,13.36128 -1.49437,19.23184 -6.95048,-0.57945 -8.13741,7.14655 -8.44641,17.73747 6.81196,10.05699 0.40281,29.59396 1.10453,38.07382 0.6023,10.56968 -3.83221,28.92103 -3.31359,42.8818 -1.52815,13.43763 -1.52381,26.08525 -4.74299,39.24334 -0.63887,12.86917 -8.60767,6.60631 -12.99448,10.72045 4.31579,8.77011 2.34472,20.88608 -0.7147,28.97769 -1.47917,8.04586 -5.57076,12.74741 -10.72045,22.8703 3.22708,13.44272 -26.10841,1.87351 -12.86454,13.57923 -7.32348,-2.71171 0.11872,9.47283 -5.97746,13.83912 -7.89636,12.11783 -17.83244,23.41804 -25.72907,35.86478 -4.11495,13.2016 -18.31969,20.2223 -21.63582,33.33085 2.6847,1.63851 7.29061,0.35014 13.25437,1.03956 12.45997,2.52317 33.02901,6.30881 30.34212,-13.12443 6.11269,-10.8652 11.15634,-21.82287 17.99736,-32.16135 10.63822,-8.79784 25.1122,-10.07993 37.87892,-12.27978 12.03466,-5.5931 24.17556,0.92477 35.28002,4.2232 12.47452,1.34421 24.07391,8.71731 34.04555,16.11316 8.61737,10.4158 12.50187,24.29432 17.08777,36.77439 13.799,-2.72294 27.0187,1.2877 40.9976,2.14409 -1.2084,-11.04481 -14.0856,-20.8086 -19.3618,-31.51162 -3.8643,-5.49343 -7.1408,-10.91518 -12.4747,-15.33349 -6.8319,-5.28019 -10.0716,-13.63895 -16.3081,-19.29681 -14.56822,-2.57925 2.7483,-27.14508 -10.65547,-23.45504 11.42057,-7.7958 1.51372,-2.76149 -8.05658,-4.28818 -8.50814,-7.52855 -9.10167,-23.72448 -17.67249,-33.65571 -8.90316,-21.68615 11.61918,-21.7931 -9.16112,-27.8082 -5.00709,-7.61751 -4.71803,-20.98316 -8.7063,-31.18676 -1.04945,-10.86153 -1.71901,-26.57089 -3.31359,-36.31958 -1.15441,-9.14552 -9.82468,-51.08453 -4.02829,-58.28025 4.73273,-9.37087 1.36905,-19.58283 -7.92664,-18.842 0.0904,-2.73944 0.37859,-10.20825 -1.68928,-19.10189 z m 13.9041,185.88608 c 0.22182,-0.0231 0.40651,0.0166 0.51978,0.12994 3.71053,3.71054 3.29132,18.81973 5.97746,21.50587 1.31826,1.31827 2.45855,19.87119 7.14696,24.55957 0.0393,0.0393 2.16963,2.34702 3.57349,3.57349 0.6986,-0.099 1.23447,-0.0146 1.23447,0.58475 0,0.46622 -0.533,0.0281 -1.23447,-0.58475 -0.92652,0.1314 -2.12856,0.58475 -2.92376,0.58475 -4.23703,0 -7.53472,1.1695 -10.78542,1.1695 -8.28768,0 -17.23458,0.64973 -25.72908,0.64973 -2.32364,0 -10.88825,-1.06667 -12.53968,0.58475 -0.10541,0.10541 -2.40537,1.0444 -3.24862,1.49436 0.14741,-0.53633 -0.17589,-1.64341 0.25989,-2.07911 1.72887,-1.72887 2.28531,-4.05083 3.57349,-6.62719 0.64182,-1.28365 0.4101,-4.50335 1.23447,-5.32774 5.4549,-5.45489 10.08547,-37.97647 12.53968,-37.684 5.68726,1.13744 13.70086,0.58891 18.51714,-1.81923 0.22629,-0.1131 1.21871,-0.64565 1.8842,-0.71469 z m -38.00887,54.31694 c -0.0566,0.13431 -0.15032,0.19481 -0.32486,0.19481 -0.0869,0 0.12641,-0.0859 0.32486,-0.19481 z" id="path3874-6" inkscape:connector-curvature="0"></path>
</g>
<g id="baguette" inkscape:label="#g3116">
<path style="fill:#efbb60;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0" d="m 215.55871,590.73041 c -1.04251,-3.37343 1.57583,-4.12969 2.39109,-6.57546 4.23903,-12.71711 19.52487,-14.54459 29.88848,-19.7264 12.76195,-6.38097 23.68638,-13.07613 38.25725,-17.93309 2.96655,-0.98885 5.44679,-4.40594 8.36876,-5.37992 3.49751,-1.16583 6.89215,-3.14718 10.1621,-4.78216 1.58352,-0.79177 3.08036,-3.01936 4.78216,-3.58662 2.81196,-0.93731 5.45039,-3.2116 8.36876,-4.18439 12.73719,-4.24573 24.86379,-11.07752 38.25725,-15.54201 5.13944,-1.71313 9.5612,-5.57812 14.34648,-7.17322 9.5052,-3.16841 20.16469,-5.12752 29.88847,-8.36878 5.25713,-1.75237 9.79641,-4.85952 14.94424,-6.57546 5.19923,-1.73307 10.76821,-2.24372 16.13979,-3.58662 7.25506,-1.81376 13.56915,-5.93283 20.92195,-7.77102 15.511,-3.87776 31.7145,-6.28475 47.2238,-10.16208 4.6306,-1.15765 9.7853,-1.46844 14.3465,-2.98883 8.1871,-2.72907 26.5833,-11.67391 33.4751,-4.78216 3.5914,3.59147 -14.5298,11.41872 -16.1398,11.95538 -2.577,0.85899 -4.4564,3.87656 -7.1733,4.78216 -4.2191,1.4064 -8.2245,7.72292 -11.9554,8.96655 -6.287,2.09568 -12.4516,7.72022 -18.5308,10.75984 -1.0309,0.51546 -1.8622,2.01552 -2.9889,2.39109 -8.8466,2.94888 -16.5243,9.06267 -25.7041,11.35762 -13.2999,3.32498 -26.86622,6.96286 -40.05053,11.35761 -15.15013,5.05005 -31.09534,7.1789 -45.43048,14.34647 -3.03665,1.51834 -7.0549,0.75759 -10.16208,1.79333 -7.71492,2.57163 -14.50556,7.027 -22.11748,9.56431 -3.22658,1.07553 -7.71816,0.27247 -10.75985,1.7933 -4.09671,2.04835 -9.23623,4.47353 -13.7487,5.97769 -5.79748,1.9325 -12.66029,2.14578 -17.93308,4.78216 -9.00923,4.50461 -29.014,12.27644 -35.26842,18.53086 -0.0572,0.0572 -22.86586,6.94966 -25.70408,8.36878 -3.11853,1.55925 -5.54237,3.96671 -8.36878,5.37992 -0.79703,0.39851 -2.19183,-0.39852 -2.98884,0 -1.14131,0.57066 -8.11542,3.41441 -8.96654,2.98886 -3.4656,-1.7328 -3.36662,-4.21595 -7.77102,-5.97771 z" id="path3876-4" inkscape:connector-curvature="0"></path>
<path inkscape:connector-curvature="0" id="path3893-5" d="m 501.12939,469.05969 c -0.5381,0.11269 -1.0981,0.19336 -1.6243,0.32486 -7.1569,1.78921 -14.4496,3.22598 -21.7658,4.67802 -1.6545,5.96825 -6.1026,13.48418 0.5848,16.82785 0.6376,0.31882 1.7013,-0.31881 2.339,0 10.6416,5.32084 17.4918,-10.64759 19.7516,-19.68664 0.1647,-0.65868 0.4047,-1.40419 0.7147,-2.14409 z m -47.6248,10.20067 c -0.4082,0.0998 -0.8272,0.15801 -1.2345,0.25989 -7.3527,1.83819 -13.66604,5.98293 -20.9211,7.79669 -0.0208,0.004 -0.0443,-0.004 -0.0649,0 -2.05473,6.38832 -5.70587,13.07116 -2.01414,16.76288 0.59186,0.59185 1.28996,1.75426 2.40397,1.75426 3.87814,0 16.57157,2.13685 18.51717,-1.75426 0.7738,-1.54767 -0.4243,-4.28063 0,-5.97746 0.8014,-3.20579 1.7207,-11.83737 3.3136,-18.842 z m -40.67274,12.53968 c -4.21034,1.75808 -8.10396,4.17403 -12.53968,5.6526 -4.73991,1.57996 -9.74124,2.89899 -14.68376,4.15823 -0.20625,0.51932 -0.4781,1.02118 -0.58475,1.23448 -0.75425,1.50848 -0.58476,4.80455 -0.58476,6.56221 0,8.81837 4.21951,8.38144 11.37018,8.38144 2.1997,0 7.01203,-0.19231 8.96619,-1.1695 0.854,-0.42701 2.98647,-1.23221 3.57348,-1.81923 2.20767,-2.20767 2.53975,-13.03184 4.4831,-23.00023 z M 370.08,505.96402 c -4.66284,1.65656 -9.00961,5.40721 -14.03404,7.082 -2.99428,0.9981 -5.94763,2.13421 -8.83625,3.31359 -1.12682,6.57228 -3.24742,13.51547 -2.79381,13.96907 0.92238,0.9224 2.47512,1.81923 4.15823,1.81923 1.15769,0 3.79489,0.50653 4.80796,0 6.73387,-3.36694 11.86519,-5.64329 14.3589,-13.12443 1.23751,-3.71255 1.66211,-8.40464 2.33901,-13.05946 z m -40.34787,17.93239 c -3.95802,1.69978 -7.93427,3.3378 -11.95492,4.67802 -2.91838,0.97279 -5.56948,3.22092 -8.38145,4.15823 -1.7018,0.56727 -3.15946,2.78171 -4.74298,3.57348 -0.002,0.006 -0.0622,-0.006 -0.0649,0 -1.62373,4.09603 -2.73739,8.30793 0.32486,11.37018 2.53557,2.53556 10.11678,-0.25043 11.95493,-1.16951 2.20126,-1.10062 5.41726,-2.42855 7.21193,-4.2232 4.36663,-4.36665 4.33014,-11.75367 5.6526,-18.3872 z m -35.34499,17.21769 c -2.89711,0.99923 -5.36939,4.41035 -8.31647,5.39271 -5.72132,1.90711 -10.85938,4.08865 -15.7883,6.43227 -2.83336,4.21595 -5.88255,9.19105 -2.98873,12.08487 1.08956,1.08956 4.72739,0.66532 5.39271,0 0.002,-0.002 5.15617,-1.40858 5.97746,-1.81923 2.3056,-1.15278 5.40161,-4.23212 7.14697,-5.97746 1.39912,-1.39912 1.69049,-5.26397 2.98873,-6.56221 2.3336,-2.3336 4.07719,-5.86266 5.58763,-9.55095 z" style="fill:#f2c77b;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0"></path>
<path inkscape:connector-curvature="0" id="path3898-5" d="m 541.21739,464.44665 c -0.3007,0.0187 -0.5726,0.0264 -0.7797,0.12995 -3.6334,1.81671 -10.1365,0.65051 -13.1244,3.63845 -1.7841,1.78411 -3.4776,5.23187 -4.808,6.56221 -2.8695,2.8695 -8.7574,2.77991 -11.9549,5.97747 -3.2597,3.25966 -6.279,9.26773 -9.551,12.53967 -1.3945,1.39451 -7.0402,-0.17173 -8.3814,1.16951 -1.1646,1.16461 -8.2083,3.55188 -10.7205,4.80796 -1.405,0.70251 -7.171,0.0208 -8.3814,-0.58476 -1.3914,-0.69571 -7.0966,-5.15802 -7.7967,-4.80795 -6.4562,3.22807 -8.5969,12.23537 -14.2939,17.93238 -0.9811,0.98103 -21.0614,3.53583 -23.32512,2.40398 -1.2788,-0.63939 -2.35344,-1.1695 -3.57349,-1.1695 -0.62053,0 -4.53386,-5.08205 -5.97746,-3.63846 -1.93867,1.93868 -2.39431,7.1373 -4.2232,8.9662 -4.77301,4.77301 -8.24641,5.32518 -14.35891,8.38144 -2.35294,1.17647 -12.19926,-1.16951 -14.94365,-1.16951 -0.46806,0 -2.69047,0.2983 -2.98874,0 -0.41746,-0.41744 -0.6225,-1.23447 -1.75425,-1.23447 -0.44928,0 -1.1451,-1.25891 -1.81923,-0.58475 -4.90742,4.90742 -7.89177,11.71008 -15.52841,15.5284 -2.78512,1.39266 -16.07918,3.07069 -19.75161,1.23448 -1.12599,-0.563 -7.24811,-3.47233 -7.73172,-2.98873 -1.036,1.036 -0.93543,3.27446 -2.40398,4.74299 -4.18044,4.18046 -6.86572,8.50072 -13.77415,11.95492 -5.25705,2.62852 -21.96504,-0.12558 -22.09062,0 -1.94566,1.94566 -4.34789,6.16712 -6.56221,8.38144 -3.35358,3.35358 -9.52964,4.72168 -12.60465,7.79669 -1.82195,1.82195 -8.93956,-0.61138 -10.72045,1.1695 -0.53411,0.53411 -9.64646,2.98874 -10.78542,2.98874 -1.35417,0 -6.32651,-1.40522 -7.14697,-0.58476 -0.64089,0.64089 -13.04392,11.00506 -13.77415,11.37018 -2.03941,1.0197 -4.11046,1.12172 -5.39271,2.40398 -1.30034,1.30036 -6.39549,-3.53854 -11.24023,-5.91249 -0.36335,0.73682 -0.69977,1.44956 -0.97459,2.27403 -0.81526,2.44577 -3.44649,3.25376 -2.40398,6.62719 4.40441,1.76176 4.26612,4.24466 7.73172,5.97746 0.85113,0.42555 7.82488,-2.41808 8.9662,-2.98873 0.797,-0.39853 2.1917,0.3985 2.98873,0 2.82641,-1.41322 5.26291,-3.83346 8.38144,-5.39271 2.83822,-1.41912 25.6719,-8.32427 25.72908,-8.38144 6.25442,-6.25442 26.27079,-14.01253 35.28002,-18.51714 5.27278,-2.63639 12.13491,-2.87546 17.93238,-4.80796 4.51248,-1.50416 9.61247,-3.92912 13.70918,-5.97746 3.04169,-1.52084 7.55884,-0.67873 10.78542,-1.75426 7.61192,-2.53731 14.37571,-7.04428 22.09063,-9.61592 3.10717,-1.03573 7.16401,-0.23591 10.20067,-1.75425 14.33514,-7.16757 30.26558,-9.30885 45.41571,-14.35891 13.18431,-4.39475 26.72302,-8.04518 40.02302,-11.37017 9.1797,-2.29495 16.8824,-8.4213 25.7291,-11.37017 1.1267,-0.37557 1.9578,-1.82355 2.9887,-2.33901 6.0793,-3.03963 12.2301,-8.68973 18.5171,-10.78542 3.7309,-1.24362 7.7358,-7.55979 11.955,-8.96619 2.7168,-0.9056 4.635,-3.94897 7.2119,-4.80796 1.2194,-0.40645 11.8427,-5.00843 15.3985,-8.77128 -0.8496,-0.12869 -1.6977,-0.19481 -2.5339,-0.19481 -0.715,0 -1.957,-0.18816 -2.8588,-0.12995 z" style="fill:#e8b151;fill-opacity:1;stroke:#ffffff;stroke-width:2.0791173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0"></path>
</g>
</g>
</svg>
</div>
<div class="attribution">logo image by <a href="http://substack.net">substack</a></div>
</div>
</div>
</div>
</div>
</div>
<!-- <script src="assets/js/email.js"></script> -->
<script>
(function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
e=o.createElement(i);r=o.getElementsByTagName(i)[0];
e.src='//www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
ga('create','UA-8478831-9','auto');ga('send','pageview');
</script>
</body>
</html>

40
server.js

@ -1,43 +1,15 @@
#!/usr/bin/env node
var fs = require('fs')
, http = require('http')
, stack = require('stack')
, route = require('tiny-route')
, assets = require('ecstatic')
, config = require('./config')
, db = require('level')(config.db_path, config.db_opts)
, port = process.env.PORT || config.port
// create the level db folder if it does not exists
if(!fs.existsSync(config.db_path)){
fs.mkdirSync(config.db_path, 0766, function(err){
if(err){
console.log(err);
}
});
}
stack.errorHandler = function error(req, res, err) {
res.statusCode = 302
res.setHeader('Location', '/')
res.end()
}
var app = stack(
route('/email', require('./src/email-submit')(db))
, route('/confirm', require('./src/email-confirm')(db))
, assets({ root: __dirname +'/html', handleError: false })
)
var ecstatic = require('ecstatic')
, app = require('http').createServer(
ecstatic({ root: __dirname + '/public' })
).listen(8000)
;
process.on('uncaughtException', function (err) {
console.error('Error at:', new Date)
console.error(err.stack)
})
http.createServer(app).listen(port, function() {
console.log('[PID='+ process.pid +'] server started on port '+ port)
console.log('(use Ctrl+c to stop the server)')
})

56
src/email-client.js

@ -1,56 +0,0 @@
var ready = require('domready')
, check_email = require('valid-email')
, loadsvg = require('load-svg')
process.nextTick(function() {
ready(function() {
var form = document.getElementById('signup-form')
, input_email = ''
, status_msg = document.getElementById('status-msg')
, logoCont = document.getElementById('logoCont')
loadsvg('/assets/img/squatconf_baguette.svg', function (err, svg) {
logoCont.appendChild(svg);
});
for (var n = 0, l = form.childNodes[1].childNodes.length; n < l; n++) {
var el = form.childNodes[1].childNodes[n]
if (el.nodeName === 'INPUT' && el.name === 'email')
input_email = el
}
document
.getElementById("signup-form")
.addEventListener("click", function(e) {
if (e.srcElement.nodeName === 'BUTTON') {
if (input_email && input_email.value) {
var is_valid = check_email(input_email.value)
if (is_valid) {
var progress = 0
, timerID = null
e.preventDefault()
status_msg.className = 'info'
status_msg.innerHTML = "Sending"
timerID = setInterval(function() {
if (++progress < 8) {
status_msg.innerHTML += "."
} else {
clearInterval(timerID)
form.submit()
}
}, 150)
} else {
e.preventDefault()
input_email.value = ''
status_msg.className = 'error'
status_msg.innerHTML = "that doesn't look like an email address,"
+ "<br />please try again..."
setTimeout(function() { status_msg.innerHTML = '&nbsp;' }, 2000)
}
}
}
})
})
})

48
src/email-confirm.js

@ -1,48 +0,0 @@
var sanitize = require('xss-escape')
, ip = require('./ip-trace')
module.exports = function(db) {
return function (req, res, next) {
req.resume()
function error(e) {
console.error(e)
return next(e || e.msg || 'ERROR')
}
var params = require('url').parse(req.url, true)
if (params && params.query.email && params.query.token) {
var email = sanitize(params.query.email)
, token = sanitize(params.query.token)
db.get(email, function(err, obj) {
if (err) return error(err)
// db read OK..
if (obj && ! obj.verified) {
if (obj.token === token) {
obj.verified = true
obj.trace = obj.trace.concat(ip(req))
db.put(email, obj, function(err) {
if (err) return error(err)
// db write OK..
res.statusCode = 302
res.setHeader('Location', '/verified.html')
return res.end()
})
}
} else {
error('email is already verified: '+ email)
}
})
} else {
error('invalid input: '+ JSON.stringify(params.query))
}
}
}

81
src/email-submit.js

@ -1,81 +0,0 @@
var sanitize = require('xss-escape')
, rn = require('./rng')
, ip = require('./ip-trace')
, config = require('../config')
, Mailgun = require('mailgun').Mailgun
, mg = new Mailgun(config.mailjetKey);
module.exports = function(db) {
return function (req, res, next) {
req.resume()
function error(e) {
console.error(e)
return next(e || e.msg || 'ERROR')
}