I get told to shut up a lot by my friend. This is the microsite that documents this in detail. shutup.jp
postcards microsite
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Swap to XMP based postcards

+203 -125
+1 -1
Taskfile.yml
··· 21 21 postcards: 22 22 desc: Pulls postcards from `ORIGINAL_POSTCARDS` (as specified in `.env`) 23 23 cmds: 24 - - postcards -f web,json --out-dir ./postcards "${ORIGINAL_POSTCARDS}"/* 24 + - postcards -f web --remove-border --out-dir ./postcards "${ORIGINAL_POSTCARDS}"/* 25 25
+6 -3
feed.xml.tmpl
··· 10 10 <copyright>CC BY-NC-SA 4.0</copyright> 11 11 <lastBuildDate>{{ now.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}</lastBuildDate> 12 12 <atom:link href="https://shutup.jp/feed.xml" rel="self" type="application/rss+xml" /> 13 - {{ range . }} 13 + {{- $sizes := .Sizes -}} 14 + {{ range .Postcards }} 14 15 <item> 15 16 <title>{{ with .Meta.Location }}{{ .Name }}{{ end }}{{ with .Meta.SentOn }} ({{ .Format "January 2, 2006" }}){{ end }}</title> 16 17 <link>https://shutup.jp/#{{ .Name }}</link> ··· 19 20 <description>{{- .Meta.Back.Transcription.Text | htmlEscape -}}</description> 20 21 <content:encoded> 21 22 <![CDATA[ 22 - <img src="https://shutup.jp/{{.Name}}.webp" alt="{{ .Meta | altText | htmlEscape }}”" /> 23 + <img src="https://shutup.jp/{{.Name}}-front.webp" alt="{{ .Meta | altText | htmlEscape }}”" /> 24 + <img src="https://shutup.jp/{{.Name}}-back.webp" alt="{{ .Meta | altText | htmlEscape }}”" /> 23 25 <p>{{- .Meta.Back.Transcription.Text -}}</p> 24 26 ]]> 25 27 </content:encoded> 26 - <enclosure url="https://shutup.jp/{{.Name}}.webp" type="image/webp" length="0"/> 28 + <enclosure url="https://shutup.jp/{{.Name}}-front.webp" type="image/webp" length="{{ index $sizes (printf "%s-front.webp" .Name) }}"/> 29 + <enclosure url="https://shutup.jp/{{.Name}}-back.webp" type="image/webp" length="{{ index $sizes (printf "%s-back.webp" .Name) }}"/> 27 30 </item> 28 31 {{ end }} 29 32 </channel>
+12
funcs.go
··· 2 2 3 3 import ( 4 4 _ "embed" 5 + "fmt" 5 6 ht "html/template" 7 + "sort" 6 8 "strings" 7 9 tt "text/template" 8 10 "time" ··· 33 35 return alt 34 36 } 35 37 38 + func annotate(at types.AnnotatedText) ht.HTML { 39 + sort.Sort(types.SortEndsLast(at.Annotations)) 40 + 41 + // TODO: Handle annotations 42 + fmt.Println(at.Annotations) 43 + 44 + return ht.HTML(htmlEscape(at.Text)) 45 + } 46 + 36 47 var funcs = ht.FuncMap{ 37 48 "htmlEscape": htmlEscape, 38 49 "lastPC": lastPC, 39 50 "now": now, 40 51 "plainify": plainify, 41 52 "altText": altText, 53 + "annotate": annotate, 42 54 } 43 55 44 56 //go:embed index.html.tmpl
+25 -27
go.mod
··· 3 3 go 1.21.6 4 4 5 5 require ( 6 - github.com/gohugoio/hugo v0.127.0 7 - github.com/jphastings/dotpostcard v0.0.0-20240727232734-9c5ceed0775e 6 + github.com/gohugoio/hugo v0.129.0 7 + github.com/jphastings/dotpostcard v0.0.0-20240728075147-6ea690890bb1 8 8 ) 9 9 10 + replace github.com/jphastings/dotpostcard => ../postcards 11 + 10 12 require ( 11 - git.sr.ht/~sbinet/cmpimg v0.1.0 // indirect 12 13 git.sr.ht/~sbinet/gg v0.5.0 // indirect 13 - github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c // indirect 14 14 github.com/bep/clocks v0.5.0 // indirect 15 15 github.com/bep/godartsass v1.2.0 // indirect 16 - github.com/bep/godartsass/v2 v2.0.0 // indirect 16 + github.com/bep/godartsass/v2 v2.1.0 // indirect 17 17 github.com/bep/golibsass v1.1.1 // indirect 18 18 github.com/bep/logg v0.4.0 // indirect 19 - github.com/bep/overlayfs v0.9.2 // indirect 19 + github.com/campoy/embedmd v1.0.0 // indirect 20 20 github.com/chai2010/webp v1.1.1 // indirect 21 21 github.com/clbanning/mxj/v2 v2.7.0 // indirect 22 22 github.com/cli/safeexec v1.0.1 // indirect 23 - github.com/davecgh/go-spew v1.1.1 // indirect 24 - github.com/dsoprea/go-exif/v2 v2.0.0-20200604193436-ca8584a0e1c4 // indirect 25 - github.com/dsoprea/go-exif/v3 v3.0.0-20210512043655-120bcdb2a55e // indirect 26 - github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb // indirect 23 + github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d // indirect 24 + github.com/dsoprea/go-exif/v3 v3.0.1 // indirect 25 + github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 // indirect 27 26 github.com/dsoprea/go-jpeg-image-structure v0.0.0-20221012074422-4f3f7e934102 // indirect 28 - github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d // indirect 29 - github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c // indirect 27 + github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect 28 + github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d // indirect 30 29 github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d // indirect 31 30 github.com/dsoprea/go-tiff-image-structure v0.0.0-20221003165014-8ecc4f52edca // indirect 32 - github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf // indirect 33 - github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e // indirect 31 + github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 // indirect 32 + github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect 34 33 github.com/ernyoke/imger v1.0.0 // indirect 35 - github.com/fatih/color v1.16.0 // indirect 36 - github.com/go-errors/errors v1.1.1 // indirect 37 - github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect 34 + github.com/fatih/color v1.17.0 // indirect 35 + github.com/go-errors/errors v1.5.1 // indirect 36 + github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect 38 37 github.com/gobwas/glob v0.2.3 // indirect 39 38 github.com/gohugoio/locales v0.14.0 // indirect 40 39 github.com/gohugoio/localescompressed v1.0.1 // indirect 41 40 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect 42 - github.com/golang/geo v0.0.0-20200319012246-673a6f80352d // indirect 41 + github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect 43 42 github.com/hhrutter/lzw v1.0.0 // indirect 44 43 github.com/mattn/go-colorable v0.1.13 // indirect 45 44 github.com/mattn/go-isatty v0.0.20 // indirect ··· 52 51 github.com/pmezard/go-difflib v1.0.0 // indirect 53 52 github.com/spf13/afero v1.11.0 // indirect 54 53 github.com/spf13/cast v1.6.0 // indirect 55 - github.com/spf13/cobra v1.8.1 // indirect 56 - github.com/spf13/pflag v1.0.5 // indirect 57 - github.com/stretchr/testify v1.9.0 // indirect 58 54 github.com/sunshineplan/tiff v0.0.0-20220128141034-29b9d69bd906 // indirect 59 - github.com/tdewolff/parse/v2 v2.7.13 // indirect 60 - golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 // indirect 55 + github.com/tdewolff/parse/v2 v2.7.15 // indirect 56 + github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 // indirect 57 + github.com/trimmer-io/go-xmp v1.0.0 // indirect 58 + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect 61 59 golang.org/x/image v0.18.0 // indirect 62 - golang.org/x/net v0.25.0 // indirect 63 - golang.org/x/sys v0.20.0 // indirect 60 + golang.org/x/net v0.27.0 // indirect 61 + golang.org/x/sys v0.22.0 // indirect 64 62 golang.org/x/text v0.16.0 // indirect 65 - google.golang.org/protobuf v1.33.0 // indirect 63 + google.golang.org/protobuf v1.34.2 // indirect 64 + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect 66 65 gopkg.in/yaml.v2 v2.4.0 // indirect 67 66 gopkg.in/yaml.v3 v3.0.1 // indirect 68 - rsc.io/pdf v0.1.1 // indirect 69 67 )
+126 -38
go.sum
··· 1 1 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 + git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo= 3 + git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE= 4 + git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= 5 + git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= 2 6 github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 h1:+tu3HOoMXB7RXEINRVIpxJCT+KdYiI7LAEAUrOw3dIU= 3 7 github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69/go.mod h1:L1AbZdiDllfyYH5l5OkAaZtk7VkWe89bPJFmnDBNHxg= 4 8 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 5 - github.com/alecthomas/chroma/v2 v2.13.0 h1:VP72+99Fb2zEcYM0MeaWJmV+xQvz5v5cxRHd+ooU1lI= 6 - github.com/alecthomas/chroma/v2 v2.13.0/go.mod h1:BUGjjsD+ndS6eX37YgTchSEG+Jg9Jv1GiZs9sqPqztk= 9 + github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= 10 + github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= 7 11 github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c h1:651/eoCRnQ7YtSjAnSzRucrJz+3iGEFt+ysraELS81M= 8 12 github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 9 13 github.com/bep/clocks v0.5.0 h1:hhvKVGLPQWRVsBP/UB7ErrHYIO42gINVbvqxvYTPVps= 10 14 github.com/bep/clocks v0.5.0/go.mod h1:SUq3q+OOq41y2lRQqH5fsOoxN8GbxSiT6jvoVVLCVhU= 11 15 github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= 12 16 github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= 13 - github.com/bep/gitmap v1.1.2 h1:zk04w1qc1COTZPPYWDQHvns3y1afOsdRfraFQ3qI840= 14 - github.com/bep/gitmap v1.1.2/go.mod h1:g9VRETxFUXNWzMiuxOwcudo6DfZkW9jOsOW0Ft4kYaY= 17 + github.com/bep/gitmap v1.6.0 h1:sDuQMm9HoTL0LtlrfxjbjgAg2wHQd4nkMup2FInYzhA= 18 + github.com/bep/gitmap v1.6.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw= 15 19 github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA= 16 20 github.com/bep/goat v0.5.0/go.mod h1:Md9x7gRxiWKs85yHlVTvHQw9rg86Bm+Y4SuYE8CTH7c= 17 21 github.com/bep/godartsass v1.2.0 h1:E2VvQrxAHAFwbjyOIExAMmogTItSKodoKuijNrGm5yU= 18 22 github.com/bep/godartsass v1.2.0/go.mod h1:6LvK9RftsXMxGfsA0LDV12AGc4Jylnu6NgHL+Q5/pE8= 19 - github.com/bep/godartsass/v2 v2.0.0 h1:Ruht+BpBWkpmW+yAM2dkp7RSSeN0VLaTobyW0CiSP3Y= 20 - github.com/bep/godartsass/v2 v2.0.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= 23 + github.com/bep/godartsass/v2 v2.1.0 h1:fq5Y1xYf4diu4tXABiekZUCA+5l/dmNjGKCeQwdy+s0= 24 + github.com/bep/godartsass/v2 v2.1.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= 21 25 github.com/bep/golibsass v1.1.1 h1:xkaet75ygImMYjM+FnHIT3xJn7H0xBA9UxSOJjk8Khw= 22 26 github.com/bep/golibsass v1.1.1/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= 23 27 github.com/bep/gowebp v0.3.0 h1:MhmMrcf88pUY7/PsEhMgEP0T6fDUnRTMpN8OclDrbrY= ··· 32 36 github.com/bep/tmc v0.5.1/go.mod h1:tGYHN8fS85aJPhDLgXETVKp+PR382OvFi2+q2GkGsq0= 33 37 github.com/bep/workers v1.0.0 h1:U+H8YmEaBCEaFZBst7GcRVEoqeRC9dzH2dWOwGmOchg= 34 38 github.com/bep/workers v1.0.0/go.mod h1:7kIESOB86HfR2379pwoMWNy8B50D7r99fRLUyPSNyCs= 39 + github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= 40 + github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= 35 41 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 42 + github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 43 + github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 44 + github.com/chai2010/webp v1.1.1 h1:jTRmEccAJ4MGrhFOrPMpNGIJ/eybIgwKpcACsrTEapk= 45 + github.com/chai2010/webp v1.1.1/go.mod h1:0XVwvZWdjjdxpUEIf7b9g9VkHFnInUSYujwqTLEuldU= 36 46 github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= 37 47 github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= 38 48 github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= ··· 47 57 github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI= 48 58 github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= 49 59 github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= 60 + github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E= 61 + github.com/dsoprea/go-exif/v2 v2.0.0-20200604193436-ca8584a0e1c4/go.mod h1:9EXlPeHfblFFnwu5UOqmP2eoZfJyAZ2Ri/Vki33ajO0= 62 + github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d h1:yeH8wrJa3+8uKKDAdURHUK1ds2UvKhMqX2MiOdVeKPs= 63 + github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d/go.mod h1:oKrjk2kb3rAR5NbtSTLUMvMSbc+k8ZosI3MaVH47noc= 64 + github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8= 65 + github.com/dsoprea/go-exif/v3 v3.0.0-20210512043655-120bcdb2a55e/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= 66 + github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= 67 + github.com/dsoprea/go-exif/v3 v3.0.0-20221003160559-cf5cd88aa559/go.mod h1:rW6DMEv25U9zCtE5ukC7ttBRllXj7g7TAHl7tQrT5No= 68 + github.com/dsoprea/go-exif/v3 v3.0.0-20221003171958-de6cb6e380a8/go.mod h1:akyZEJZ/k5bmbC9gA612ZLQkcED8enS9vuTiuAkENr0= 69 + github.com/dsoprea/go-exif/v3 v3.0.1 h1:/IE4iW7gvY7BablV1XY0unqhMv26EYpOquVMwoBo/wc= 70 + github.com/dsoprea/go-exif/v3 v3.0.1/go.mod h1:10HkA1Wz3h398cDP66L+Is9kKDmlqlIJGPv8pk4EWvc= 71 + github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM= 72 + github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 h1:YDRiMEm32T60Kpm35YzOK9ZHgjsS1Qrid+XskNcsdp8= 73 + github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM= 74 + github.com/dsoprea/go-jpeg-image-structure v0.0.0-20221012074422-4f3f7e934102 h1:P1dsxzctGkmG6Zf7gH2xrZhNXWP5/FuLDI7xbCGsWTo= 75 + github.com/dsoprea/go-jpeg-image-structure v0.0.0-20221012074422-4f3f7e934102/go.mod h1:6+tQXZ+I62x13UZ+hemLVoZIuq/usVzvau7bqwUo9P0= 76 + github.com/dsoprea/go-logging v0.0.0-20190624164917-c4f10aab7696/go.mod h1:Nm/x2ZUNRW6Fe5C3LxdY1PyZY5wmDv/s5dkPJ/VB3iA= 77 + github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8= 78 + github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd h1:l+vLbuxptsC6VQyQsfD7NnEC8BZuFpz45PgY+pH8YTg= 79 + github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8= 80 + github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E= 81 + github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d h1:dg6UMHa50VI01WuPWXPbNJpO8QSyvIF5T5n2IZiqX3A= 82 + github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E= 83 + github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d h1:8+qI8ant/vZkNSsbwSjIR6XJfWcDVTg/qx/3pRUUZNA= 84 + github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d/go.mod h1:yTR3tKgyk20phAFg6IE9ulMA5NjEDD2wyx+okRFLVtw= 85 + github.com/dsoprea/go-tiff-image-structure v0.0.0-20221003165014-8ecc4f52edca h1:C0gA/12rFBjBZU+NipamTpthuJaAReN4Ydx63WRqphM= 86 + github.com/dsoprea/go-tiff-image-structure v0.0.0-20221003165014-8ecc4f52edca/go.mod h1:Lro6zqt9pr9yVPwBaM5ijpieYLc4Fy+ObmL5SKP7LrU= 87 + github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8= 88 + github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 h1:/py11NlxDaOxkT9OKN+gXgT+QOH5xj1ZRoyusfRIlo4= 89 + github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349/go.mod h1:KVK+/Hul09ujXAGq+42UBgCTnXkiJZRnLYdURGjQUwo= 90 + github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU= 91 + github.com/dsoprea/go-utility/v2 v2.0.0-20221003142440-7a1927d49d9d/go.mod h1:LVjRU0RNUuMDqkPTxcALio0LWPFPXxxFCvVGVAwEpFc= 92 + github.com/dsoprea/go-utility/v2 v2.0.0-20221003160719-7bc88537c05e/go.mod h1:VZ7cB0pTjm1ADBWhJUOHESu4ZYy9JN+ZPqjfiW09EPU= 93 + github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 h1:DilThiXje0z+3UQ5YjYiSRRzVdtamFpvBQXKwMglWqw= 94 + github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349/go.mod h1:4GC5sXji84i/p+irqghpPFZBF8tRN/Q7+700G0/DLe8= 50 95 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 51 96 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 52 - github.com/evanw/esbuild v0.20.2 h1:E4Y0iJsothpUCq7y0D+ERfqpJmPWrZpNybJA3x3I4p8= 53 - github.com/evanw/esbuild v0.20.2/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= 54 - github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= 55 - github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= 97 + github.com/ernyoke/imger v1.0.0 h1:v+vnOpZwCfet5AUruwhN54g9v8CnhKOB3ZCsMIa5AZ0= 98 + github.com/ernyoke/imger v1.0.0/go.mod h1:Ft4UQ3taMpn8EVVLWRlT0ijOvMTKZZqhXXR4VzCsAT4= 99 + github.com/evanw/esbuild v0.21.4 h1:pe4SEQMoR1maEjhgWPEPWmUy11Jp6nidxd1mOvMrFFU= 100 + github.com/evanw/esbuild v0.21.4/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= 101 + github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= 102 + github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= 56 103 github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= 57 104 github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= 58 105 github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= ··· 64 111 github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= 65 112 github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= 66 113 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 114 + github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 115 + github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= 116 + github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= 117 + github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= 118 + github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= 119 + github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= 67 120 github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= 68 121 github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= 69 122 github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw= 70 123 github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= 124 + github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= 125 + github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= 126 + github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= 71 127 github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA= 72 128 github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= 73 129 github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= ··· 76 132 github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e/go.mod h1:3Ltoo9Banwq0gOtcOwxuHG6omk+AwsQPADyw2vQYOJQ= 77 133 github.com/gohugoio/httpcache v0.7.0 h1:ukPnn04Rgvx48JIinZvZetBfHaWE7I01JR2Q2RrQ3Vs= 78 134 github.com/gohugoio/httpcache v0.7.0/go.mod h1:fMlPrdY/vVJhAriLZnrF5QpN3BNAcoBClgAyQd+lGFI= 79 - github.com/gohugoio/hugo v0.127.0 h1:7iKOa0NntxekHHkx2sc4BTsNUpTYE28jnpNM3vrvNr4= 80 - github.com/gohugoio/hugo v0.127.0/go.mod h1:CH5I652/zeb3xwK7dOpd4GFn6ID2hOyvBXaJ2uNDRYQ= 81 - github.com/gohugoio/hugo-goldmark-extensions/extras v0.1.0 h1:YhxZNU8y2vxV6Ibr7QJzzUlpr8oHHWX/l+Q1R/a5Zao= 82 - github.com/gohugoio/hugo-goldmark-extensions/extras v0.1.0/go.mod h1:0cuvOnGKW7WeXA3i7qK6IS07FH1bgJ2XzOjQ7BMJYH4= 135 + github.com/gohugoio/hugo v0.129.0 h1:AWyne6qC/fg/XNTLHpuaefXHkukzAWBmSkersovh8tI= 136 + github.com/gohugoio/hugo v0.129.0/go.mod h1:PBbF9ucsywUwysYkwUEYfK5IWH045VVdxKz7KZ7kYyY= 137 + github.com/gohugoio/hugo-goldmark-extensions/extras v0.2.0 h1:MNdY6hYCTQEekY0oAfsxWZU1CDt6iH+tMLgyMJQh/sg= 138 + github.com/gohugoio/hugo-goldmark-extensions/extras v0.2.0/go.mod h1:oBdBVuiZ0fv9xd8xflUgt53QxW5jOCb1S+xntcN4SKo= 83 139 github.com/gohugoio/hugo-goldmark-extensions/passthrough v0.2.0 h1:PCtO5l++psZf48yen2LxQ3JiOXxaRC6v0594NeHvGZg= 84 140 github.com/gohugoio/hugo-goldmark-extensions/passthrough v0.2.0/go.mod h1:g9CCh+Ci2IMbPUrVJuXbBTrA+rIIx5+hDQ4EXYaQDoM= 85 141 github.com/gohugoio/locales v0.14.0 h1:Q0gpsZwfv7ATHMbcTNepFd59H7GoykzWJIxi113XGDc= 86 142 github.com/gohugoio/locales v0.14.0/go.mod h1:ip8cCAv/cnmVLzzXtiTpPwgJ4xhKZranqNqtoIu0b/4= 87 143 github.com/gohugoio/localescompressed v1.0.1 h1:KTYMi8fCWYLswFyJAeOtuk/EkXR/KPTHHNN9OS+RTxo= 88 144 github.com/gohugoio/localescompressed v1.0.1/go.mod h1:jBF6q8D7a0vaEmcWPNcAjUZLJaIVNiwvM3WlmTvooB0= 145 + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= 146 + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= 147 + github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= 148 + github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= 149 + github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= 150 + github.com/golang/geo v0.0.0-20230421003525-6adc56603217 h1:HKlyj6in2JV6wVkmQ4XmG/EIm+SCYlPZ+V4GWit7Z+I= 151 + github.com/golang/geo v0.0.0-20230421003525-6adc56603217/go.mod h1:8wI0hitZ3a1IxZfeH3/5I97CI8i5cLGsYe7xNhQGs9U= 89 152 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 90 153 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 91 154 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= ··· 109 172 github.com/hairyhenderson/go-codeowners v0.4.0/go.mod h1:iJgZeCt+W/GzXo5uchFCqvVHZY2T4TAIpvuVlKVkLxc= 110 173 github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= 111 174 github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= 175 + github.com/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0= 176 + github.com/hhrutter/lzw v1.0.0/go.mod h1:2HC6DJSn/n6iAZfgM3Pg+cP1KxeWc3ezG8bBqW5+WEo= 112 177 github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= 113 178 github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= 114 179 github.com/jdkato/prose v1.2.1 h1:Fp3UnJmLVISmlc57BgKUzdjr0lOtjqTZicL3PaYy6cU= 115 180 github.com/jdkato/prose v1.2.1/go.mod h1:AiRHgVagnEx2JbQRQowVBKjG0bcs/vtkGCH1dYAL1rA= 181 + github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 182 + github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= 116 183 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= 117 184 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 118 - github.com/jphastings/dotpostcard v0.0.0-20240727232734-9c5ceed0775e h1:fj2dkDQc6OYENIFOCExEsxzOH2N4PD7hf1zNX4MQITY= 119 - github.com/jphastings/dotpostcard v0.0.0-20240727232734-9c5ceed0775e/go.mod h1:68L9zp0miQyeHGXmBOpvbQdqIebd6cK1HQsCBfSeZ7A= 120 185 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 121 186 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 122 187 github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= ··· 184 249 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 185 250 github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 186 251 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 187 - github.com/tdewolff/minify/v2 v2.20.20 h1:vhULb+VsW2twkplgsawAoUY957efb+EdiZ7zu5fUhhk= 188 - github.com/tdewolff/minify/v2 v2.20.20/go.mod h1:GYaLXFpIIwsX99apQHXfGdISUdlA98wmaoWxjT9C37k= 189 - github.com/tdewolff/parse/v2 v2.7.13 h1:iSiwOUkCYLNfapHoqdLcqZVgvQ0jrsao8YYKP/UJYTI= 190 - github.com/tdewolff/parse/v2 v2.7.13/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA= 191 - github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52 h1:gAQliwn+zJrkjAHVcBEYW/RFvd2St4yYimisvozAYlA= 252 + github.com/sunshineplan/tiff v0.0.0-20220128141034-29b9d69bd906 h1:+yYRCj+PGQNnnen4+/Q7eKD2J87RJs+O39bjtHhPauk= 253 + github.com/sunshineplan/tiff v0.0.0-20220128141034-29b9d69bd906/go.mod h1:O+Ar7ouRbdfxLgoZLFz447/dvdM1NVKk1VpOQaijvAU= 254 + github.com/tdewolff/minify/v2 v2.20.36 h1:uhbCO5NNS0UgJfEyE/ZR+xU5DL9Dz0ngrJ8W9A6coCQ= 255 + github.com/tdewolff/minify/v2 v2.20.36/go.mod h1:L1VYef/jwKw6Wwyk5A+T0mBjjn3mMPgmjjA688RNsxU= 256 + github.com/tdewolff/parse/v2 v2.7.15 h1:hysDXtdGZIRF5UZXwpfn3ZWRbm+ru4l53/ajBRGpCTw= 257 + github.com/tdewolff/parse/v2 v2.7.15/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA= 192 258 github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= 259 + github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo= 260 + github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= 261 + github.com/trimmer-io/go-xmp v1.0.0 h1:zY8bolSga5kOjBAaHS6hrdxLgEoYuT875xTy0QDwZWs= 262 + github.com/trimmer-io/go-xmp v1.0.0/go.mod h1:Aaptr9sp1lLv7UnCAdQ+gSHZyY2miYaKmcNVj7HRBwA= 193 263 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 194 - github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= 195 - github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= 196 - github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s= 197 - github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY= 264 + github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= 265 + github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= 266 + github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4= 267 + github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= 198 268 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 199 269 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 200 270 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 201 - golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 h1:QfTh0HpN6hlw6D3vu8DAwC8pBIwikq0AI1evdm+FksE= 202 - golang.org/x/exp v0.0.0-20221031165847-c99f073a8326/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= 271 + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= 272 + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= 203 273 golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= 204 274 golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= 205 275 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 206 276 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 207 277 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 208 278 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 209 - golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= 210 - golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 279 + golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= 280 + golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 211 281 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 212 282 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 213 283 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 214 284 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 215 285 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 216 286 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 287 + golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 288 + golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 289 + golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 290 + golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 291 + golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 217 292 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 218 - golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= 219 - golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 293 + golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= 294 + golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= 295 + golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= 220 296 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 221 297 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 222 298 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= ··· 227 303 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 228 304 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 229 305 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 306 + golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 230 307 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 308 + golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 231 309 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 232 310 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 311 + golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 312 + golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 233 313 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 314 + golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 234 315 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 235 - golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= 236 - golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 316 + golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= 317 + golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 237 318 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 319 + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 238 320 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 239 321 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 240 322 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 323 + golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 241 324 golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= 242 325 golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= 243 326 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= ··· 247 330 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 248 331 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 249 332 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 250 - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= 251 - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 333 + golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= 334 + golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= 252 335 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 253 336 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 254 337 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= ··· 269 352 google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 270 353 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 271 354 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 272 - google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= 273 - google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 355 + google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= 356 + google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 274 357 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 275 - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= 276 358 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 359 + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 360 + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 277 361 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 362 + gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 363 + gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 278 364 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 279 365 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 280 366 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= ··· 282 368 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 283 369 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 284 370 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 371 + rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= 372 + rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+2 -2
index.html.tmpl
··· 23 23 <cite><a target="_blank" href="https://www.byjp.me">JP</a></cite> 24 24 </section> 25 25 26 - {{ range . }} 26 + {{ range .Postcards }} 27 27 <figure> 28 28 <input type="checkbox" id="{{.Name}}"> 29 29 <label for="{{.Name}}"> ··· 35 35 36 36 <figcaption> 37 37 <div class="title">{{ with .Meta.Location }}<span>{{ .Name }}</span>{{ end }}{{ with .Meta.SentOn }} <time datetime="{{ . }}">{{ .Format "January 2, 2006" }}</time>{{ end }}</div> 38 - <div class="transcription">{{- .Meta.Back.Transcription.Text -}}</div> 38 + <div class="transcription">{{- .Meta.Back.Transcription | annotate -}}</div> 39 39 </figcaption> 40 40 </figure> 41 41 {{ end }}
+31 -17
main.go
··· 1 1 package main 2 2 3 3 import ( 4 + "errors" 4 5 "io" 5 6 "os" 6 7 "path" 7 8 "path/filepath" 8 9 "sort" 9 10 10 - "github.com/jphastings/dotpostcard/formats/metadata" 11 + "github.com/jphastings/dotpostcard/formats" 12 + "github.com/jphastings/dotpostcard/formats/component" 13 + "github.com/jphastings/dotpostcard/formats/web" 11 14 "github.com/jphastings/dotpostcard/types" 12 15 ) 13 16 ··· 19 22 } 20 23 } 21 24 25 + type tmplVars struct { 26 + Postcards []types.Postcard 27 + Sizes map[string]int64 28 + } 29 + 22 30 func main() { 23 - files, err := filepath.Glob("postcards/*-meta.json") 31 + files, err := filepath.Glob("postcards/*.postcard.webp") 24 32 check(err) 25 33 26 - var pcs []types.Postcard 34 + vars := tmplVars{ 35 + Sizes: make(map[string]int64), 36 + } 27 37 toCopy := []string{ 28 38 "static/postcard.css", 29 39 "static/shutup.css", ··· 31 41 "static/bg-dark.png", 32 42 "static/og-image.jpg", 33 43 } 44 + check(os.MkdirAll(outDir, 0755)) 34 45 35 46 for _, file := range files { 36 47 f, err := os.Open(file) 37 48 check(err) 38 49 defer f.Close() 39 50 40 - b, err := metadata.BundleFromFile(f, path.Dir(file)) 41 - check(err) 42 - 51 + b := web.BundleFromReader(f, file) 43 52 pc, err := b.Decode(nil) 44 53 check(err) 45 54 46 - imgName := "postcards/" + pc.Name + ".postcard.webp" 47 - // fs, err := os.Stat(imgName) 48 - // check(err) 49 - // pc.ImgSize = fs.Size() 55 + pcImgName := "postcards/" + pc.Name + ".postcard.webp" 56 + vars.Postcards = append(vars.Postcards, pc) 57 + toCopy = append(toCopy, pcImgName) 50 58 51 - pcs = append(pcs, pc) 52 - toCopy = append(toCopy, imgName) 59 + // Make front & back covers 60 + for _, fw := range component.Codec().Encode(pc, &formats.EncodeOptions{MaxDimension: 800}) { 61 + fname, err := fw.WriteFile(outDir, false) 62 + if !errors.Is(err, os.ErrExist) { 63 + check(err) 64 + } 65 + fs, err := os.Stat(path.Join(outDir, fname)) 66 + check(err) 67 + vars.Sizes[fname] = fs.Size() 68 + } 53 69 } 54 - sort.Sort(types.BySentOn(pcs)) 55 - 56 - check(os.MkdirAll("dist/", 0755)) 70 + sort.Sort(types.BySentOn(vars.Postcards)) 57 71 58 72 indexF, err := os.OpenFile(path.Join(outDir, "index.html"), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) 59 73 check(err) 60 - check(indexTmpl.Execute(indexF, pcs)) 74 + check(indexTmpl.Execute(indexF, vars)) 61 75 62 76 feedF, err := os.OpenFile(path.Join(outDir, "feed.xml"), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) 63 77 check(err) 64 - check(feedTmpl.Execute(feedF, pcs)) 78 + check(feedTmpl.Execute(feedF, vars)) 65 79 66 80 for _, tc := range toCopy { 67 81 src, err := os.Open(tc)
-1
postcards/athens-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Athens, Greece","latitude":37.9720629,"longitude":23.7218496},"flip":"book","sentOn":"2022-05-15","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A view of Athens' Old Town at dusk, towards the Acropolis. The town's lights glow a golden yellow, as do the lights illuminating the Acropolis itself.","transcription":{}},"back":{"transcription":{"text":"Σκάσε, JP!","annotations":[{"type":"locale","value":"el-GR","start":0,"end":10}]},"secrets":[{"prehidden":true,"points":[[0.5573217726,0.4476987448],[0.9494219653,0.4476987448],[0.9494219653,0.5962343097],[0.5573217726,0.5962343097]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"519/32","cmH":"717/64","pxW":2076,"pxH":1434}}}
postcards/athens.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/big-pit-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Big Pit National Coal Museum, Wales, UK","latitude":51.77242287556142,"longitude":-3.1046103152588698},"flip":"book","sentOn":"2022-11-05","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"An illustration of the words \"BIG PIT\" shaped to look like a mountain with a coal mine atop it.","transcription":{}},"back":{"transcription":{"text":"Cau i fyny, JP","annotations":[{"type":"locale","value":"cy-GB","start":0,"end":14}]},"secrets":[{"prehidden":true,"points":[[0.6360327571,0.467648943],[0.8234758872,0.467648943],[0.8234758872,0.7405509289],[0.6360327571,0.7405509289]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"1099/64","cmH":"1561/128","pxW":2198,"pxH":1561}}}
postcards/big-pit.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/boston-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Boston, Massachusetts, USA","latitude":42.34304,"longitude":-71.03009},"flip":"book","sentOn":"2022-09-02","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A reproduction of a painting representing the Boston Tea Party — sailors throwing boxes of tea into the sea from their ships. Overlayed with text saying \"The Boston Tea Party\" and \"1773\".","transcription":{}},"back":{"transcription":{"text":"\u003cBoston accent\u003e\nShut up JP\n\u003c/Boston accent\u003e\n","annotations":[{"type":"locale","value":"en-US","start":0,"end":43}]},"secrets":[{"prehidden":true,"points":[[0.6064483112,0.4300291545],[0.9687819857,0.4300291545],[0.9687819857,0.6771137026],[0.6064483112,0.6771137026]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"977/64","cmH":"343/32","pxW":1954,"pxH":1372}}}
postcards/boston.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/cambodia-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Angkor Wat, Cambodia","latitude":13.412406663980926,"longitude":103.8669642414902},"flip":"book","sentOn":"2017-05-05","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photograph of Angkor Wat across a lake, at sunset.","transcription":{}},"back":{"description":"A simple postcard back including a description of Angkor Wat: The spectacular Angkor Wat 'the temple mountain' rises 65 metres and dates back to the 8th century. Its moat, enclosures and towers were constructed in the Khmer method symbolizing the centre of the Hindu Universe, Mount Meru.","transcription":{"text":"បិទមាត់! Shut up JP","annotations":[{"type":"locale","value":"km-KH","start":0,"end":9}]},"secrets":[{"prehidden":true,"points":[[0.6217561322,0.5842857143],[0.9619623178000001,0.5842857143],[0.9619623178000001,0.8042857143],[0.6217561322,0.8042857143]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"2813/128","cmH":"175/16","pxW":2813,"pxH":1400}}}
postcards/cambodia.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/canada-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Spitfire Cafe, Ottawa, Canada","latitude":44.5906072,"longitude":-75.6834661},"flip":"book","sentOn":"2020-01-26","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A collage of smaller photos showing aspects of the Spitfire Cafe. Clockwise from top left: an ornate ceiling light with two small fans; a cluster of three pillar candles; a collection of card and postcard stacks, \"cards $5\"; a close-up of what looks like a chrome bumper on a glossy teal background, with the Spitefire Cafe logo overprinted; a low upright piano keyboard next to a yellow wall; (in the centre) a coffee in a chipped mug with a heart visible in the milk froth.","transcription":{}},"back":{"description":"A postcard made by the Spitfire Cafe with its address and phone number beneath the logo: 10 Victoria Ave, Brockville, ON K6V 2B1, Canada (613) 865-9348. At the bottom of the card it says: Brockville's finest cafe serving up the best in coffee, food and music. We specialize in local artisan crafts \u0026 stationary with a retro twist. We are located minutes from the scenic waterfront and the action downtown in a breathtaking historic mansion.","transcription":{"text":"Hey JP - why don't you stuff it, eh?","annotations":[{"type":"locale","value":"en-CA","start":0,"end":36}]},"secrets":[{"prehidden":true,"points":[[0.5369360436,0.4727941176],[0.9414972731,0.4727941176],[0.9414972731,0.6132352941],[0.5369360436,0.6132352941]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"2017/128","cmH":"85/8","pxW":2017,"pxH":1360}}}
postcards/canada.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/china-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Kunming, China","latitude":24.88852411010394,"longitude":102.82871098125743},"flip":"right-hand","sentOn":"2019-10-26","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A street market in China. Two women sit selling ingredients in the foreground. Red umbrellas cover a stall with a giant cooking wok and selling oranges just beyond. An old, green, two story corner building stands just beyond.","transcription":{}},"back":{"description":"A simple postcard back, with two large China postage stamps in pink and green, and a \"航空 Par avion\" red stamp beneath the message text.","transcription":{"text":"住口JP","annotations":[{"type":"locale","value":"zh-CN","start":0,"end":4}]},"secrets":[{"prehidden":true,"points":[[0.5698761688,0.5755978922],[0.9390952742,0.5755978922],[0.9390952742,0.8179975679],[0.5698761688,0.8179975679]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"169/16","cmH":"541/32","pxW":1352,"pxH":2164}}}
postcards/china.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/first-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Gourmet Burger Kitchen, London, UK","latitude":51.51320877085788,"longitude":-0.09940537159155438},"flip":"book","sentOn":"2015-12-01","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A sales postcard from the restaurant chain Gourmet Burger Kitchen, describing their \"Oh my Gosht!\" Indian themed lamb burgers.","transcription":{}},"back":{"description":"A mostly pre-printed postcard back asking for feedback from customers who've visited GBK. Tucked into the corner, tiny next to a large sign stating \"Make some noise\" and \"We're hungry for your feedback\", is a three-word, angled, and handwritten sentence: \"Shut up, JP.\"","transcription":{"text":"Shut up, JP.","annotations":[{"type":"locale","value":"en-GB","start":0,"end":4}]},"secrets":[{"prehidden":true,"points":[[0.5460593654,0.456227758],[0.9385875128000001,0.456227758],[0.9385875128000001,0.7615658363],[0.5460593654,0.7615658363]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"977/64","cmH":"1405/128","pxW":1954,"pxH":1405}}}
postcards/first.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/france-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Montpellier, France","latitude":43.61111948103742,"longitude":3.8755433842799594},"flip":"left-hand","sentOn":"2016-04-04","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"transcription":{}},"back":{"transcription":{"text":"Tais-toi, JP.","annotations":[{"type":"locale","value":"fr-FR","start":0,"end":13}]},"secrets":[{"prehidden":true,"points":[[0.5229312064,0.4835646457],[0.8499501496,0.4835646457],[0.8499501496,0.6186997808],[0.5229312064,0.6186997808]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"1369/128","cmH":"1003/64","pxW":1369,"pxH":2006}}}
postcards/france.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/georgia-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Alaverdi Cathedral, Georgia","latitude":42.032460034919566,"longitude":45.37722825634398},"flip":"book","sentOn":"2023-07-23","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photograph of a large red bricked cathedral with a tall bell tower and a smaller bell tower to the right. The cathedral is surrounded by trees and mountains.","transcription":{}},"back":{"transcription":{"text":"მოკეტე JP!","annotations":[{"type":"locale","value":"ka-GE","start":0,"end":10}]},"secrets":[{"prehidden":true,"points":[[0.535079051383399,0.61238025055269],[0.943675889283399,0.61238025055269],[0.943675889283399,0.77892409725269],[0.535079051383399,0.77892409725269]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"253/16","cmH":"1357/128","pxW":2024,"pxH":1357}}}
postcards/georgia.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/guatemala-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Tikal Templo V, Guatemala","latitude":17.219701,"longitude":-89.62373},"flip":"book","sentOn":"2022-04-11","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photo of Tikal Templo V in Guatemala, partially covered by nearby rainforest folliage.","transcription":{}},"back":{"transcription":{"text":"¡JP, cállate!","annotations":[{"type":"locale","value":"es-GT","start":0,"end":13}]},"secrets":[{"prehidden":true,"points":[[0.5514606742,0.6056782334],[0.8179775281,0.6056782334],[0.8179775281,0.7709779179],[0.5514606742,0.7709779179]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"2225/128","cmH":"1585/128","pxW":2225,"pxH":1585}}}
postcards/guatemala.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/iceland-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Reykjavík, Iceland","latitude":64.12,"longitude":-21.85},"flip":"left-hand","sentOn":"2023-01-13","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"An illustration of two fiendishly grinning presumed Icelandic Vikings turning on an anachronistic water main connected to a distant geyser spraying water over people running away from it. Text reads \"Iceland turns you on!\" and \"Hot and cold running water everywhere!\"","transcription":{}},"back":{"transcription":{"text":"Haltu Kjafti, JP","annotations":[{"type":"locale","value":"is-IS","start":0,"end":16}]},"secrets":[{"prehidden":true,"points":[[0.5386199794,0.3934782609],[0.9588053553011329,0.3934782609],[0.9588053553011329,0.510869565247826],[0.5386199794,0.510869565247826]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"345/32","cmH":"971/64","pxW":1380,"pxH":1942}}}
postcards/iceland.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/italy-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Galleria dell'Accademia, Florence, Italy","latitude":43.776826311063886,"longitude":11.258640740774178},"flip":"book","sentOn":"2023-10-18","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photo of the naked waist of Michelangelo's sculpture of David, with \"wow!!!\" superimposed in a semicircle around his penis.","transcription":{}},"back":{"transcription":{"text":"Stai zito, JP","annotations":[{"type":"locale","value":"it-IT","start":0,"end":13}]},"secrets":[{"prehidden":true,"points":[[0.5744575937,0.4494109494],[0.8814102564,0.4494109494],[0.8814102564,0.6254331254],[0.5744575937,0.6254331254]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"67600/3937","cmH":"48100/3937","pxW":4056,"pxH":2886}}}
postcards/italy.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/japan-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Japan","latitude":35.71,"longitude":139.71},"flip":"left-hand","sentOn":"2024-04-15","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"From \"To Love Ru\" manga: In a flowering meadow, under a blue sky, a gently smiling large chested anime woman (with pink hair and a gold necklace, crown, and heart-shaped staff) stands back to back with a cross-armed charcter in a blue cape facing away from us.\n","transcription":{}},"back":{"transcription":{"text":"黙って、JP!","annotations":[{"type":"locale","value":"ja-JA","start":0,"end":7}]},"secrets":[{"prehidden":true,"points":[[0.6200335758,0.4601844091],[0.9054280916999999,0.4601844091],[0.9054280916999999,0.6777032691],[0.6200335758,0.6777032691]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"39750/3937","cmH":"59550/3937","pxW":2385,"pxH":3573}}}
postcards/japan.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/korea-butt-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"South Korea","latitude":37.54,"longitude":126.99},"flip":"right-hand","sentOn":"2024-04-23","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A smiling, orange illustrated person falling over, with their butt in the air, papers flying overhead, possibly flipping the bird at us. Korean text below seems to read \"I don't want to work, dance\".\n","transcription":{}},"back":{"transcription":{"text":"입다물어, JP","annotations":[{"type":"locale","value":"ko-KR","start":0,"end":8}]},"secrets":[{"prehidden":true,"points":[[0.5683106576,0.6098579783],[0.8557256235999999,0.6098579783],[0.8557256235999999,0.7522974102],[0.5683106576,0.7522974102]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"119650/11811","cmH":"176350/11811","pxW":2393,"pxH":3527}}}
postcards/korea-butt.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/korea-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Seoul, Korea","latitude":37.55590970079184,"longitude":126.9926593678283},"flip":"book","sentOn":"2017-12-21","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A Jetoy branded illustration. A red through red pastel coloured backdrop with simple mountains or clouds. In the foreground a white furred and blue eyed kitten, with a (human-style) head of black hair, is wearing a kimono with white flowers on a blue background.","transcription":{}},"back":{"transcription":{"text":"입 닥쳐 JP","annotations":[{"type":"locale","value":"ko-KR","start":0,"end":7}]},"secrets":[{"prehidden":true,"points":[[0.5368171021,0.0647223332],[0.8147268408,0.0647223332],[0.8147268408,0.2045545346],[0.5368171021,0.2045545346]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"421/32","cmH":"2503/128","pxW":1684,"pxH":2503}}}
postcards/korea.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/leica-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Leica Gallery, Wetzlar, Germany","latitude":50.552941934493084,"longitude":8.536942159173067},"flip":"book","sentOn":"2023-05-24","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A black and white close-up photo of a presumed woman's feet in high-heels and tights with the arch of the heel perfectly framing a distant man in a suit. All next to the Eiffel Tower.","transcription":{}},"back":{"transcription":{"text":"Halt die Klappe, JP","annotations":[{"type":"locale","value":"de-DE","start":0,"end":19}]},"secrets":[{"prehidden":true,"points":[[0.60082944530845,0.461203770848441],[0.912389839294972,0.461203770848441],[0.912389839294972,0.663524292965917],[0.60082944530845,0.663524292965917]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"1929/128","cmH":"1379/128","pxW":1929,"pxH":1379}}}
postcards/leica.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/loch-ness-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Loch Ness, Scotland, UK","latitude":57.321533148442384,"longitude":-4.432586127947921},"flip":"right-hand","sentOn":"2021-08-21","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"transcription":{}},"back":{"transcription":{"text":"Dùin do glub, JP\n\nlol it looks a bit like a willy doesn't it\n","annotations":[{"type":"locale","value":"gd-GB","start":0,"end":16}]},"secrets":[{"prehidden":true,"points":[[0.6039163329,0.3550863724],[0.7854917668,0.3550863724],[0.7854917668,0.6084452975000001],[0.6039163329,0.6084452975000001]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"1563/128","cmH":"2247/128","pxW":1563,"pxH":2247}}}
postcards/loch-ness.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/madrid-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Madrid, Spain","latitude":40.4234699,"longitude":-3.7137392},"flip":"book","sentOn":"2022-01-24","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photograph across the rooves of Madrid, with two cats sitting on the rooftop edge.","transcription":{}},"back":{"transcription":{"text":"¡JP, cállate!","annotations":[{"type":"locale","value":"es-ES","start":0,"end":13}]},"secrets":[{"prehidden":true,"points":[[0.5592417062,0.6145479266],[0.9535545024000001,0.6145479266],[0.9535545024000001,0.7654656696],[0.5592417062,0.7654656696]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"1055/64","cmH":"1471/128","pxW":2110,"pxH":1471}}}
postcards/madrid.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/malaysia-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"The Petronas Towers, Kuala Lumpur, Malaysia","latitude":3.1587262190722614,"longitude":101.71068390500886},"flip":"book","sentOn":"2017-05-29","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A sunset view of Kuala Lumpur's skyline.","transcription":{}},"back":{"transcription":{"text":"Diam, JP.","annotations":[{"type":"locale","value":"id-MY","start":0,"end":9}]},"secrets":[{"prehidden":true,"points":[[0.6163410302,0.4540372671],[0.9671403196999999,0.4540372671],[0.9671403196999999,0.5900621118],[0.6163410302,0.5900621118]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"563/32","cmH":"805/64","pxW":2252,"pxH":1610}}}
postcards/malaysia.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/morocco-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Les Dunes de Sable, Merzouga, Morocco","latitude":31.10209565249995,"longitude":-4.004023293530289},"flip":"left-hand","sentOn":"2023-06-19","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"The undulating dunes of a desert, with a single green bush in the middle, and a small corner of blue sky.","transcription":{}},"back":{"transcription":{"text":"JP, إخرس","annotations":[{"type":"locale","value":"ar-MA","start":0,"end":8}]},"secrets":[{"prehidden":true,"points":[[0.6362410072,0.6742857143],[0.9667266187,0.6742857143],[0.9667266187,0.8292063491999999],[0.6362410072,0.8292063491999999]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"1575/128","cmH":"139/8","pxW":1575,"pxH":2224}}}
postcards/morocco.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/new-zealand-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Port Chalmers, New Zealand","latitude":-45.81758644078448,"longitude":170.62079248072317},"flip":"book","sentOn":"2024-01-28","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"Four views of the town of Port Chalmers, including the pub sign of \"The Portsider\", and a grand vista of the bay with a cruise liner in dock.","transcription":{}},"back":{"transcription":{"text":"Tō waha, JP.","annotations":[{"type":"locale","value":"mi-NZ","start":0,"end":12}]},"secrets":[{"prehidden":true,"points":[[0.5964626484,0.4302004147],[0.9518268559999999,0.4302004147],[0.9518268559999999,0.6755355909],[0.5964626484,0.6755355909]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"214850/11811","cmH":"144700/11811","pxW":4297,"pxH":2894}}}
postcards/new-zealand.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/nyc-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"New York City, USA","latitude":40.71518353253348,"longitude":-73.92916576072076},"flip":"book","sentOn":"2023-03-24","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A collection of overlayed photos representing New York City, including the Statue of Liberty in the middle, the Chrysler \u0026 Empire State Buildings, and the Brooklyn Bridge on the left, and a street of yellow taxis and the US flag on the right.","transcription":{}},"back":{"transcription":{"text":"Eyyyy ohhh\neyyy guy…\n\nShaddap-a yo face, JP!\n","annotations":[{"type":"locale","value":"en-US","start":0,"end":44}]},"secrets":[{"prehidden":true,"points":[[0.59175704989154,0.536101083032491],[0.955748373101952,0.536101083032491],[0.955748373101952,0.669073405535499],[0.59175704989154,0.669073405535499]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"2305/128","cmH":"831/64","pxW":2305,"pxH":1662}}}
postcards/nyc.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/oklahoma-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Oklahoma, USA","latitude":35.46,"longitude":-97.52},"flip":"left-hand","sentOn":"2024-07-18","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A print of a grinning cowboy riding a wild bucking buffalo","transcription":{}},"back":{"transcription":{"text":"(Ope, just gonna sneak past you… to say)\n\nShut up, JP.\n","annotations":[{"type":"locale","value":"en-US","start":0,"end":54}]},"secrets":[{"prehidden":true,"points":[[0.4998520272,0.553447478],[0.8321988754,0.553447478],[0.8321988754,0.7644608977],[0.4998520272,0.7644608977]]}]},"context":{"author":{"name":"JP","uri":"https://www.byjp.me"},"description":"This is the first #ShutUpJP postcard I received after my wedding, addressed to my new surname."},"physical":{"frontSize":{"cmW":"1143/125","cmH":"71501/5000","pxW":2160,"pxH":3378}}}
postcards/oklahoma.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/philadelphia-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Philadelphia Museum of Art, Philadelphia, USA","latitude":39.96558608911079,"longitude":-75.18097682865891},"flip":"left-hand","sentOn":"2023-03-22","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photograph of a bronze statue of Rocky Balboa, a fictional boxer from the Rocky film series, wearing boxing gloves and shorts, with his arms raised in victory.","transcription":{}},"back":{"transcription":{"text":"Shut up, JP.","annotations":[{"type":"locale","value":"en-US","start":0,"end":12}]},"secrets":[{"prehidden":true,"points":[[0.610738255033557,0.4434030281],[0.783686112533557,0.4434030281],[0.783686112533557,0.684931506831074],[0.610738255033557,0.684931506831074]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"1387/128","cmH":"1937/128","pxW":1387,"pxH":1937}}}
postcards/philadelphia.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/portland-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Portland, Oregon, USA","latitude":45.5199,"longitude":-122.6821},"flip":"book","sentOn":"2017-07-11","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"An illustration of a naked, but booted, man and woman riding a tandem bike on a background of hearts.","transcription":{}},"back":{"transcription":{"text":"SHUT UP, JP.","annotations":[{"type":"locale","value":"en-US","start":0,"end":12}]},"secrets":[{"prehidden":true,"points":[[0.5798110393,0.5128771155],[0.9741422178,0.5128771155],[0.9741422178,0.6968359087],[0.5798110393,0.6968359087]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"2011/128","cmH":"1359/128","pxW":2011,"pxH":1359}}}
postcards/portland.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/portugal-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Carvoeiro, Portugal","latitude":37.09616870462492,"longitude":-8.471126816441089},"flip":"book","sentOn":"2022-09-09","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"6 square tiling patterns in blue, green, red and yellow on a postcard made entirely of cord. The word \"Portugal\" sits between four of the tiles.","transcription":{}},"back":{"description":"A postcard made entirely of cork.","transcription":{"text":"Cala a boca, JP!","annotations":[{"type":"locale","value":"pt-PT","start":0,"end":16}]},"secrets":[{"prehidden":true,"points":[[0.547209181,0.4772727273],[0.9587897757000001,0.4772727273],[0.9587897757000001,0.7371212120999999],[0.547209181,0.7371212120999999]]}]},"context":{"author":{"name":"JP","uri":"https://www.byjp.me"},"description":"This postcard is made entirely of cork, so it's a little floppy!"},"physical":{"frontSize":{"cmW":"1917/128","cmH":"165/16","pxW":1917,"pxH":1320}}}
postcards/portugal.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/seattle-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"The Space Needle, Seattle, USA","latitude":47.6205638250662,"longitude":-122.34930209624935},"flip":"right-hand","sentOn":"2022-07-07","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A replica of a '60s era postcard, on embossed paper. Shows a simple illustration of the Space Needle, described as being from Seattle's World Fair in 1962.","transcription":{}},"back":{"description":"A broadly plain postcard back, with text describing the Space Needle depicted on the front: The 605-foot tall Space Needle opened at the Century 21 World's Fair on April 21, 1962. The structure of itself weights 3700 tons with the foundation being 30 feet below the ground and weighing 5850 tons. There are 848 steps from the basement to the observation deck. On April 21, 1999 the Space Needle's 37th birthday, the City's Landmarks Preservation Board named it an official City of Seattle Landmark.","transcription":{"text":"Shut up, JP.","annotations":[{"type":"locale","value":"en-US","start":0,"end":12}]},"secrets":[{"prehidden":true,"points":[[0.610046608,0.4534883721],[0.9181771103,0.4534883721],[0.9181771103,0.5813953488],[0.610046608,0.5813953488]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"43/4","cmH":"1931/128","pxW":1376,"pxH":1931}}}
postcards/seattle.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/singapore-breakfast-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Singapore","latitude":1.35,"longitude":103.75},"flip":"book","sentOn":"2017-12-13","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photograph of a \"local breakfast\", including a plate of toast sandwiches with a yellow (egg or cheese) filling, two hardboiled eggs, a cup of coffee.","transcription":{}},"back":{"transcription":{"text":"Shut up, JP\nJP வாயை மூடு\nJangan bisinglah, JP\n闭嘴JP\n\nUgh Singapore, why you gotta have 4 official languages?!\n","annotations":[{"type":"locale","value":"en-SG","start":0,"end":11},{"type":"locale","value":"ta-SG","start":12,"end":24},{"type":"locale","value":"ms-SG","start":25,"end":45},{"type":"locale","value":"zh-SG","start":46,"end":50}]},"secrets":[{"prehidden":true,"points":[[0.6394508671,0.626468285],[0.9696531792,0.626468285],[0.9696531792,0.8073610023],[0.6394508671,0.8073610023]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"173/8","cmH":"1277/128","pxW":2768,"pxH":1277}}}
postcards/singapore-breakfast.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/singapore-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Gardens by the Bay, Singapore","latitude":1.281629186099575,"longitude":103.8646889076446},"flip":"book","sentOn":"2017-06-05","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photograph of Singapore's concrete 'supertrees' and walkway in the Gardens at the Bay.","transcription":{}},"back":{"transcription":{"text":"住口,JP","annotations":[{"type":"locale","value":"zh-SG","start":0,"end":5}]},"secrets":[{"prehidden":true,"points":[[0.5858398889,0.5096345515],[0.9495603887,0.5096345515],[0.9495603887,0.7448504983],[0.5858398889,0.7448504983]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"2161/128","cmH":"1505/128","pxW":2161,"pxH":1505}}}
postcards/singapore.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/split-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Split, Croatia","latitude":43.51377107863206,"longitude":16.442092000279143},"flip":"right-hand","sentOn":"2023-04-06","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A collage of photos of showing the beautiful, sunny limestone buildings of Split, with the city's name overlayed.","transcription":{}},"back":{"transcription":{"text":"Začepi, JP.","annotations":[{"type":"locale","value":"hr-HR","start":0,"end":11}]},"secrets":[{"prehidden":true,"points":[[0.5994136461,0.499804152],[0.9429637527000001,0.499804152],[0.9429637527000001,0.7070113592],[0.5994136461,0.7070113592]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"127600/11811","cmH":"6050/381","pxW":2552,"pxH":3751}}}
postcards/split.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/sri-lanka-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Sigiriya Rock, Sri Lanka","latitude":7.957080514851897,"longitude":80.75999950789985},"flip":"book","sentOn":"2020-03-28","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photo of the rock-top palace that is Sigiriya Rock.","transcription":{}},"back":{"transcription":{"text":"வாயை மூடு JP.\n\n(Had to send from UK — needed to leave in a hurry!)\n","annotations":[{"type":"locale","value":"ta-LK","start":0,"end":13}]},"secrets":[{"prehidden":true,"points":[[0.5249343832,0.5440194293],[0.9343832021,0.5440194293],[0.9343832021,0.7067395264],[0.5249343832,0.7067395264]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"1143/64","cmH":"1647/128","pxW":2286,"pxH":1647}}}
postcards/sri-lanka.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/stockholm-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Stockholm, Sweden","latitude":59.3289,"longitude":18.067},"flip":"book","sentOn":"2016-06-15","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"An aerial photograph of snow-covered Stockholm's harbours.","transcription":{}},"back":{"transcription":{"text":"HALL KÄFTEN, JP.","annotations":[{"type":"locale","value":"se-SE","start":0,"end":16}]},"secrets":[{"prehidden":true,"points":[[0.5751088534,0.5138369484],[0.9775036283999999,0.5138369484],[0.9775036283999999,0.7344801795],[0.5751088534,0.7344801795]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"689/32","cmH":"1337/128","pxW":2756,"pxH":1337}}}
postcards/stockholm.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/thailand-dejavu-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"\"Grandfather\" rock, Ko Samui, Thailand\n","latitude":9.452072579994384,"longitude":100.03957230526304},"flip":"book","sentOn":"2024-03-10","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photo of large rock shaped like a penis, overlooking the sea.","transcription":{}},"back":{"transcription":{"text":"เงียบ, JP.","annotations":[{"type":"locale","value":"th-TH","start":0,"end":10}]},"secrets":[{"prehidden":true,"points":[[0.5512405609,0.448263119],[0.9619741099999999,0.448263119],[0.9619741099999999,0.6245380636],[0.5512405609,0.6245380636]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"61800/3937","cmH":"45100/3937","pxW":3708,"pxH":2706}}}
postcards/thailand-dejavu.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/thailand-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"\"Grandfather\" rock, Ko Samui, Thailand\n","latitude":9.452072579994384,"longitude":100.03957230526304},"flip":"book","sentOn":"2023-10-02","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photo of large rock shaped like a penis, overlooking the sea.","transcription":{}},"back":{"transcription":{"text":"หยุดพูดเหอะ JP","annotations":[{"type":"locale","value":"th-TH","start":0,"end":14}]},"secrets":[{"prehidden":true,"points":[[0.5488372093,0.4070981211],[0.9671682627,0.4070981211],[0.9671682627,0.5929018789],[0.5488372093,0.5929018789]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"182750/11811","cmH":"119750/11811","pxW":3655,"pxH":2395}}}
postcards/thailand.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/vancouver-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Stanley Park, Vancouver, Canada","latitude":49.304,"longitude":-123.144},"flip":"book","sentOn":"2022-09-09","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A photograph of a collection of detailed and colourful totem poles of different heights in Stanley Park. They are in front of verdant tall trees, and a rich blue sky.","transcription":{}},"back":{"description":"Explanation text says: The Totem Poles in Stanley Park are a major tourist attraction.","transcription":{"text":"Shut up, JP\n\n(eh)\n","annotations":[{"type":"locale","value":"en-CA","start":0,"end":17}]},"secrets":[{"prehidden":true,"points":[[0.5953991881,0.6036036036],[0.949481281,0.6036036036],[0.949481281,0.750965251],[0.5953991881,0.750965251]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"2217/128","cmH":"777/64","pxW":2217,"pxH":1554}}}
postcards/vancouver.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/vietnam-hologram-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Hoi An, Vietnam","latitude":15.879845988978815,"longitude":108.33875834189223},"flip":"book","sentOn":"2024-04-02","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"An (impossible to scan) holographic print of a colourful illustration of a pre-industrial city (presumably in Vietnam).","transcription":{}},"back":{"transcription":{"text":"Im Lặng, JP.","annotations":[{"type":"locale","value":"vi-VN","start":0,"end":12}]},"secrets":[{"prehidden":true,"points":[[0.3770577476,0.646969697],[0.6553436112,0.646969697],[0.6553436112,0.7848484848999999],[0.3770577476,0.7848484848999999]]}]},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"191300/11811","cmH":"131950/11811","pxW":3826,"pxH":2639}}}
postcards/vietnam-hologram.postcard.webp

This is a binary file and will not be displayed.

-1
postcards/vietnam-meta.json
··· 1 - {"locale":"en-GB","location":{"name":"Ho Chi Minh City, Vietnam","latitude":10.77943355855801,"longitude":106.70009064690898},"flip":"book","sentOn":"2017-03-24","sender":{"name":"Claire","uri":"https://www.instagram.com/claire.durrant88/"},"recipient":{"name":"JP","uri":"https://www.byjp.me"},"front":{"description":"A scene made from rolled shapes of paper","transcription":{}},"back":{"description":"A white rectangle of paper stuck to the postcard's thick black backing. It has simple red ink handwriting dead centre.","transcription":{}},"context":{"author":{"name":""},"description":""},"physical":{"frontSize":{"cmW":"2187/128","cmH":"199/16","pxW":2187,"pxH":1592}}}
postcards/vietnam.postcard.webp

This is a binary file and will not be displayed.