-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathfeed.xml
1083 lines (811 loc) · 151 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://solidproject.org//feed.xml" rel="self" type="application/atom+xml" /><link href="https://solidproject.org//" rel="alternate" type="text/html" /><updated>2020-11-12T02:40:31+00:00</updated><id>https://solidproject.org//feed.xml</id><title type="html">Solid</title><subtitle>Website for solidproject.org</subtitle><entry><title type="html">Getting Started</title><link href="https://solidproject.org//developers/tutorials/getting-started" rel="alternate" type="text/html" title="Getting Started" /><published>2020-11-06T00:00:00+00:00</published><updated>2020-11-06T00:00:00+00:00</updated><id>https://solidproject.org//developers/tutorials/00_getting-started</id><content type="html" xml:base="https://solidproject.org//developers/tutorials/getting-started"><h1 id="getting-started">Getting Started</h1>
<p>This tutorial creates an introductory application that uses Inrupt’s
<a href="https://github.com/inrupt/solid-client-js">JavaScript Client Libraries</a> to read
and write your user profile data.</p>
<p>Alternatively, to create a sample application using Inrupt’s Solid React SDK,
refer to Inrupt’s <a href="https://docs.inrupt.com/developer-tools/javascript/react-sdk/">Solid React SDK documentation</a>.</p>
<p>This tutorial uses <a href="https://www.npmjs.com/get-npm">npm</a> and <a href="https://parceljs.org/">Parcel</a>
to run the application locally on <code class="language-plaintext highlighter-rouge">localhost:1234</code>.</p>
<p><img src="/assets/img/tutorials/locally-run-application.png" alt="Locally Run Getting Started Application" /></p>
<h2 id="prerequisites">Prerequisites</h2>
<p><strong>NOTE:</strong> This tutorial assumes the creation of a testing Pod on
<code class="language-plaintext highlighter-rouge">https://solidcommunity.net/</code>. If your Pod is not on
<code class="language-plaintext highlighter-rouge">https://solidcommunity.net/</code> (e.g. perhaps you created your Pod on
<code class="language-plaintext highlighter-rouge">https://pod.inrupt.com</code>), then you’ll just need to change the value of the
<code class="language-plaintext highlighter-rouge">IDENTITY_PROVIDER</code> variable in the application’s <code class="language-plaintext highlighter-rouge">index.js</code> file (shown
below) accordingly, and you can ignore the following Pod registration steps.</p>
<h3 id="register-your-pod-and-create-your-profile">Register Your Pod and Create Your Profile</h3>
<p>If you don’t already have a Pod, simply register one now:</p>
<ul>
<li>
<p>Open a browser to <code class="language-plaintext highlighter-rouge">https://solidcommunity.net/</code>.</p>
</li>
<li>
<p>Click <code class="language-plaintext highlighter-rouge">Register</code>.</p>
</li>
<li>
<p>Fill in the registration form and click <code class="language-plaintext highlighter-rouge">Register</code>.</p>
<p>You’ll be redirected to your public Solid Pod URL:
<code class="language-plaintext highlighter-rouge">https://&lt;yourusername&gt;.solidcommunity.net/</code>.</p>
</li>
</ul>
<h3 id="install-npm">Install <code class="language-plaintext highlighter-rouge">npm</code></h3>
<p>If you don’t already have <code class="language-plaintext highlighter-rouge">npm</code> installed, follow the appropriate instructions
here: <a href="https://www.npmjs.com/get-npm">install npm</a>. <code class="language-plaintext highlighter-rouge">npm</code> is installed as part of the
Node.js installation.</p>
<h2 id="build-the-application">Build the Application</h2>
<ol>
<li>
<p>Initialize the application</p>
<ul>
<li>Create a directory for the application:</li>
</ul>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nb">mkdir </span>my-demo-app
</code></pre></div> </div>
<ul>
<li>Go into the newly created directory:</li>
</ul>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nb">cd </span>my-demo-app
</code></pre></div> </div>
<ul>
<li>
<p>Create a brand new, empty application:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> npm init
</code></pre></div> </div>
<ul>
<li>
<p>During initialization, you can either hit return to accept the
default values (including empty values), or supply your own values.</p>
</li>
<li>
<p>When prompted <code class="language-plaintext highlighter-rouge">Is this OK? (yes)</code>, hit return to accept <code class="language-plaintext highlighter-rouge">yes</code>.</p>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Install the Inrupt client libraries:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> npm <span class="nb">install</span> @inrupt/solid-client @inrupt/solid-client-authn-browser @inrupt/vocab-common-rdf
</code></pre></div> </div>
</li>
<li>
<p>Install Parcel:</p>
<ul>
<li>
<p>Use <code class="language-plaintext highlighter-rouge">npm</code> to install <code class="language-plaintext highlighter-rouge">Parcel</code>:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> npm <span class="nb">install </span>parcel-bundler
</code></pre></div> </div>
</li>
</ul>
</li>
<li>
<p>Edit the <code class="language-plaintext highlighter-rouge">package.json</code> file to list the browsers supported by
this application. Specifically, add the <code class="language-plaintext highlighter-rouge">browserslist</code> field and value:</p>
<p><strong>NOTE:</strong> Be sure to add the comma after the preceding field before adding
the <code class="language-plaintext highlighter-rouge">browserslist</code> field.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="s2">"dependencies"</span>: <span class="o">{</span>
...
<span class="o">}</span>,
<span class="s2">"browserslist"</span>: <span class="o">[</span>
<span class="s2">"last 3 and_chr versions"</span>,
<span class="s2">"last 3 chrome versions"</span>,
<span class="s2">"last 3 opera versions"</span>,
<span class="s2">"last 3 ios_saf versions"</span>,
<span class="s2">"last 3 safari versions"</span>,
<span class="s2">"last 3 edge versions"</span>
<span class="o">]</span>
</code></pre></div> </div>
<p><strong>NOTE:</strong> Without the <code class="language-plaintext highlighter-rouge">browserslist</code> specification, Parcel would need to
inject a compatibility layer to avoid a <code class="language-plaintext highlighter-rouge">regeneratorRuntime</code> reference error
since our sample application uses <code class="language-plaintext highlighter-rouge">async</code> functions.</p>
<p>As an alternative to modifying the <code class="language-plaintext highlighter-rouge">package.json</code> file, you could import
<code class="language-plaintext highlighter-rouge">regenerator-runtime/runtime</code> in your JavaScript code, which will inject a
suitable compatibility layer.</p>
</li>
<li>
<p>Create the Application:</p>
<p>In the <code class="language-plaintext highlighter-rouge">my-demo-app</code> directory, create the files for our application.</p>
<ul>
<li>
<p>Create a <code class="language-plaintext highlighter-rouge">my-demo.css</code> file with the following content:</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nt">h2</span><span class="o">,</span><span class="nt">h3</span> <span class="p">{</span>
<span class="nl">margin</span><span class="p">:</span> <span class="m">1rem</span> <span class="m">1.2rem</span> <span class="m">1rem</span> <span class="m">1.4rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">header</span> <span class="p">{</span>
<span class="nl">border-bottom</span><span class="p">:</span> <span class="m">#5795b9</span> <span class="nb">solid</span><span class="p">;</span>
<span class="nl">padding-left</span><span class="p">:</span> <span class="m">.5rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.panel</span> <span class="p">{</span>
<span class="nl">border</span><span class="p">:</span> <span class="m">1px</span> <span class="nb">solid</span> <span class="m">#005b81</span><span class="p">;</span>
<span class="nl">border-radius</span><span class="p">:</span> <span class="m">4px</span><span class="p">;</span>
<span class="nl">box-shadow</span><span class="p">:</span> <span class="nb">rgb</span><span class="p">(</span><span class="m">184</span><span class="p">,</span> <span class="m">196</span><span class="p">,</span> <span class="m">194</span><span class="p">)</span> <span class="m">0px</span> <span class="m">4px</span> <span class="m">10px</span> <span class="m">-4px</span><span class="p">;</span>
<span class="nl">box-sizing</span><span class="p">:</span> <span class="n">border-box</span><span class="p">;</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">1rem</span> <span class="m">1.5rem</span><span class="p">;</span>
<span class="nl">margin</span><span class="p">:</span> <span class="m">1rem</span> <span class="m">1.2rem</span> <span class="m">1rem</span> <span class="m">1.2rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="nf">#login</span> <span class="p">{</span>
<span class="nl">background</span><span class="p">:</span> <span class="no">white</span><span class="p">;</span>
<span class="p">}</span>
<span class="nf">#read</span> <span class="p">{</span>
<span class="nl">background</span><span class="p">:</span> <span class="m">#e6f4f9</span><span class="p">;</span>
<span class="p">}</span>
<span class="nf">#labelStatus</span><span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s1">"alert"</span><span class="o">]</span> <span class="p">{</span>
<span class="nl">padding-left</span><span class="p">:</span> <span class="m">1rem</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span> <span class="no">purple</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.display</span> <span class="p">{</span>
<span class="nl">margin-left</span><span class="p">:</span> <span class="m">1rem</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span> <span class="no">gray</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">dl</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">grid</span><span class="p">;</span>
<span class="py">grid-template-columns</span><span class="p">:</span> <span class="n">max-content</span> <span class="nb">auto</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div> </div>
</li>
<li>
<p>Create an <code class="language-plaintext highlighter-rouge">index.html</code> file with the following content:</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;</span>
<span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;title&gt;</span>Getting Started: Inrupt JavaScript Client Libraries<span class="nt">&lt;/title&gt;</span>
<span class="nt">&lt;script </span><span class="na">defer</span> <span class="na">src=</span><span class="s">"./index.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
<span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"my-demo.css"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
<span class="nt">&lt;header&gt;</span>
<span class="nt">&lt;h2&gt;</span>Getting Started<span class="nt">&lt;/h2&gt;</span>
<span class="nt">&lt;h3&gt;</span>with Inrupt JavaScript Client Libraries<span class="nt">&lt;/h3&gt;</span>
<span class="nt">&lt;/header&gt;</span>
<span class="nt">&lt;section</span> <span class="na">id=</span><span class="s">"login"</span> <span class="na">class=</span><span class="s">"panel"</span><span class="nt">&gt;</span>
<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"row"</span><span class="nt">&gt;</span>
<span class="nt">&lt;label</span> <span class="na">id=</span><span class="s">"labelLogin"</span> <span class="na">for=</span><span class="s">"btnLogin"</span><span class="nt">&gt;</span>1. Click the button to log into
<span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">"identity_provider"</span><span class="nt">&gt;</span>...provided by the JavaScript code...<span class="nt">&lt;/span&gt;</span>:
<span class="nt">&lt;/label&gt;</span>
<span class="nt">&lt;button</span> <span class="na">name=</span><span class="s">"btnLogin"</span> <span class="na">id=</span><span class="s">"btnLogin"</span><span class="nt">&gt;</span>Login<span class="nt">&lt;/button&gt;</span>
<span class="nt">&lt;p</span> <span class="na">id=</span><span class="s">"labelStatus"</span><span class="nt">&gt;&lt;/p&gt;</span>
<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/section&gt;</span>
<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"read"</span> <span class="na">class=</span><span class="s">"panel"</span><span class="nt">&gt;</span>
<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"row"</span><span class="nt">&gt;</span>
<span class="nt">&lt;label</span> <span class="na">id=</span><span class="s">"writelabel"</span> <span class="na">for=</span><span class="s">"name"</span><span class="nt">&gt;</span>2. Write your name: <span class="nt">&lt;/label&gt;</span>
<span class="nt">&lt;input</span>
<span class="na">type=</span><span class="s">"text"</span>
<span class="na">id=</span><span class="s">"input_name"</span>
<span class="na">name=</span><span class="s">"name"</span>
<span class="na">size=</span><span class="s">"50"</span>
<span class="na">value=</span><span class="s">"Your name here"</span>
<span class="nt">/&gt;</span>
<span class="nt">&lt;button</span> <span class="na">name=</span><span class="s">"btnWrite"</span> <span class="na">id=</span><span class="s">"btnWrite"</span><span class="nt">&gt;</span>Write to Profile<span class="nt">&lt;/button&gt;</span>
<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;dl</span> <span class="na">class=</span><span class="s">"display"</span><span class="nt">&gt;</span>
<span class="nt">&lt;dt&gt;</span>Writing status:<span class="err">&amp;</span>nbsp<span class="nt">&lt;/dt&gt;</span>
<span class="nt">&lt;strong&gt;&lt;span</span> <span class="na">id=</span><span class="s">"labelWriteStatus"</span><span class="nt">&gt;</span>...not written yet...<span class="nt">&lt;/span&gt;&lt;/strong&gt;</span>
<span class="nt">&lt;/dl&gt;</span>
<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"read"</span> <span class="na">class=</span><span class="s">"panel"</span><span class="nt">&gt;</span>
<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"row"</span><span class="nt">&gt;</span>
<span class="nt">&lt;label</span> <span class="na">id=</span><span class="s">"readlabel"</span> <span class="na">for=</span><span class="s">"webID"</span>
<span class="nt">&gt;</span>3. Read back name (anyone's!) from their WebID:
<span class="nt">&lt;/label&gt;</span>
<span class="nt">&lt;input</span>
<span class="na">type=</span><span class="s">"url"</span>
<span class="na">id=</span><span class="s">"webID"</span>
<span class="na">name=</span><span class="s">"webID"</span>
<span class="na">size=</span><span class="s">"50"</span>
<span class="na">value=</span><span class="s">"...not logged in yet - but enter any WebID to read from its profile..."</span>
<span class="nt">/&gt;</span>
<span class="nt">&lt;button</span> <span class="na">name=</span><span class="s">"btnRead"</span> <span class="na">id=</span><span class="s">"btnRead"</span><span class="nt">&gt;</span>Read Profile<span class="nt">&lt;/button&gt;</span>
<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;dl</span> <span class="na">class=</span><span class="s">"display"</span><span class="nt">&gt;</span>
<span class="nt">&lt;dt&gt;</span>Formatted Name (FN) read from Pod:<span class="err">&amp;</span>nbsp<span class="nt">&lt;/dt&gt;</span>
<span class="nt">&lt;strong&gt;&lt;span</span> <span class="na">id=</span><span class="s">"labelFN"</span><span class="nt">&gt;</span>...not read yet...<span class="nt">&lt;/span&gt;&lt;/strong&gt;</span>
<span class="nt">&lt;/dl&gt;</span>
<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div> </div>
</li>
<li>
<p>Create an <code class="language-plaintext highlighter-rouge">index.js</code> file with the following content:</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">import</span> <span class="p">{</span>
<span class="nx">getSolidDataset</span><span class="p">,</span>
<span class="nx">getThing</span><span class="p">,</span>
<span class="nx">setThing</span><span class="p">,</span>
<span class="nx">getStringNoLocale</span><span class="p">,</span>
<span class="nx">setStringNoLocale</span><span class="p">,</span>
<span class="nx">saveSolidDatasetAt</span>
<span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@inrupt/solid-client</span><span class="dl">"</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">Session</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@inrupt/solid-client-authn-browser</span><span class="dl">"</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">VCARD</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@inrupt/vocab-common-rdf</span><span class="dl">"</span><span class="p">;</span>
<span class="c1">// If your Pod is *not* on `solidcommunity.net`, change this to your identity provider.</span>
<span class="kd">const</span> <span class="nx">IDENTITY_PROVIDER</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">https://solidcommunity.net</span><span class="dl">"</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">identity_provider</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`[&lt;a target="_blank" href="</span><span class="p">${</span><span class="nx">IDENTITY_PROVIDER</span><span class="p">}</span><span class="s2">"&gt;</span><span class="p">${</span><span class="nx">IDENTITY_PROVIDER</span><span class="p">}</span><span class="s2">&lt;/a&gt;]`</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">NOT_ENTERED_WEBID</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">...not logged in yet - but enter any WebID to read from its profile...</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">session</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Session</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">buttonLogin</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#btnLogin</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">buttonWrite</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#btnWrite</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">buttonRead</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#btnRead</span><span class="dl">"</span><span class="p">);</span>
<span class="c1">// Click button if the user hits the 'Enter' key when entering name.</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#input_name</span><span class="dl">"</span><span class="p">).</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">keyup</span><span class="dl">"</span><span class="p">,</span> <span class="nx">event</span> <span class="o">=&gt;</span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">key</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">Enter</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">buttonWrite</span><span class="p">.</span><span class="nx">click</span><span class="p">();</span>
<span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="c1">// Click button if the user hits the 'Enter' key when entering WebID.</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#webID</span><span class="dl">"</span><span class="p">).</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">keyup</span><span class="dl">"</span><span class="p">,</span> <span class="nx">event</span> <span class="o">=&gt;</span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">key</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">Enter</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">buttonRead</span><span class="p">.</span><span class="nx">click</span><span class="p">();</span>
<span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="c1">// 1a. Start Login Process. Call session.login() function.</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nx">login</span><span class="p">()</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span>
<span class="o">!</span><span class="nx">session</span><span class="p">.</span><span class="nx">info</span><span class="p">.</span><span class="nx">isLoggedIn</span> <span class="o">&amp;&amp;</span>
<span class="o">!</span><span class="k">new</span> <span class="nx">URL</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span><span class="p">).</span><span class="nx">searchParams</span><span class="p">.</span><span class="kd">get</span><span class="p">(</span><span class="dl">"</span><span class="s2">code</span><span class="dl">"</span><span class="p">)</span>
<span class="p">)</span> <span class="p">{</span>
<span class="k">await</span> <span class="nx">session</span><span class="p">.</span><span class="nx">login</span><span class="p">({</span>
<span class="na">oidcIssuer</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://solidcommunity.net</span><span class="dl">"</span><span class="p">,</span>
<span class="na">clientName</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Inrupt tutorial client app</span><span class="dl">"</span><span class="p">,</span>
<span class="na">redirectUrl</span><span class="p">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// 1b. Login Redirect. Call session.handleIncomingRedirect() function.</span>
<span class="c1">// When redirected after login, finish the process by retrieving session information.</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nx">handleRedirectAfterLogin</span><span class="p">()</span> <span class="p">{</span>
<span class="k">await</span> <span class="nx">session</span><span class="p">.</span><span class="nx">handleIncomingRedirect</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">session</span><span class="p">.</span><span class="nx">info</span><span class="p">.</span><span class="nx">isLoggedIn</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Update the page with the status.</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span>
<span class="dl">"</span><span class="s2">labelStatus</span><span class="dl">"</span>
<span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`Your session is logged in with the WebID [&lt;a target="_blank" href="</span><span class="p">${</span><span class="nx">session</span><span class="p">.</span><span class="nx">info</span><span class="p">.</span><span class="nx">webId</span><span class="p">}</span><span class="s2">"&gt;</span><span class="p">${</span><span class="nx">session</span><span class="p">.</span><span class="nx">info</span><span class="p">.</span><span class="nx">webId</span><span class="p">}</span><span class="s2">&lt;/a&gt;].`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelStatus</span><span class="dl">"</span><span class="p">).</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">role</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">alert</span><span class="dl">"</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">webID</span><span class="dl">"</span><span class="p">).</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">session</span><span class="p">.</span><span class="nx">info</span><span class="p">.</span><span class="nx">webId</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// The example has the login redirect back to the index.html.</span>
<span class="c1">// This calls the function to process login information.</span>
<span class="c1">// If the function is called when not part of the login redirect, the function is a no-op.</span>
<span class="nx">handleRedirectAfterLogin</span><span class="p">();</span>
<span class="c1">// 2. Write to profile</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nx">writeProfile</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">name</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">input_name</span><span class="dl">"</span><span class="p">).</span><span class="nx">value</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">session</span><span class="p">.</span><span class="nx">info</span><span class="p">.</span><span class="nx">isLoggedIn</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// You must be authenticated to write.</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelWriteStatus</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`...you can't write [</span><span class="p">${</span><span class="nx">name</span><span class="p">}</span><span class="s2">] until you first login!`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelWriteStatus</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">`red`</span><span class="p">;</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="kd">const</span> <span class="nx">webID</span> <span class="o">=</span> <span class="nx">session</span><span class="p">.</span><span class="nx">info</span><span class="p">.</span><span class="nx">webId</span><span class="p">;</span>
<span class="c1">// To write to a profile, you must be authenticated. That is the role of the fetch</span>
<span class="c1">// parameter in the following call.</span>
<span class="kd">let</span> <span class="nx">myProfileDataset</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">getSolidDataset</span><span class="p">(</span><span class="nx">webID</span><span class="p">,</span> <span class="p">{</span>
<span class="na">fetch</span><span class="p">:</span> <span class="nx">session</span><span class="p">.</span><span class="nx">fetch</span>
<span class="p">});</span>
<span class="kd">let</span> <span class="nx">profile</span> <span class="o">=</span> <span class="nx">getThing</span><span class="p">(</span><span class="nx">myProfileDataset</span><span class="p">,</span> <span class="nx">webID</span><span class="p">);</span>
<span class="c1">// Using the name provided in text field, update the name in your profile.</span>
<span class="c1">// VCARD.fn object is a convenience object that includes the identifier string "http://www.w3.org/2006/vcard/ns#fn".</span>
<span class="c1">// As an alternative, you can pass in the "http://www.w3.org/2006/vcard/ns#fn" string instead of VCARD.fn.</span>
<span class="nx">profile</span> <span class="o">=</span> <span class="nx">setStringNoLocale</span><span class="p">(</span><span class="nx">profile</span><span class="p">,</span> <span class="nx">VCARD</span><span class="p">.</span><span class="nx">fn</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
<span class="c1">// Write back the profile to the dataset.</span>
<span class="nx">myProfileDataset</span> <span class="o">=</span> <span class="nx">setThing</span><span class="p">(</span><span class="nx">myProfileDataset</span><span class="p">,</span> <span class="nx">profile</span><span class="p">);</span>
<span class="c1">// Write back the dataset to your Pod.</span>
<span class="k">await</span> <span class="nx">saveSolidDatasetAt</span><span class="p">(</span><span class="nx">webID</span><span class="p">,</span> <span class="nx">myProfileDataset</span><span class="p">,</span> <span class="p">{</span>
<span class="na">fetch</span><span class="p">:</span> <span class="nx">session</span><span class="p">.</span><span class="nx">fetch</span>
<span class="p">});</span>
<span class="c1">// Update the page with the retrieved values.</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelWriteStatus</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`Wrote [</span><span class="p">${</span><span class="nx">name</span><span class="p">}</span><span class="s2">] as name successfully!`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelWriteStatus</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">`black`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">`red`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`...click the 'Read Profile' button to to see what the name might be now...?!`</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// 3. Read profile</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nx">readProfile</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">webID</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">webID</span><span class="dl">"</span><span class="p">).</span><span class="nx">value</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">webID</span> <span class="o">===</span> <span class="nx">NOT_ENTERED_WEBID</span><span class="p">)</span> <span class="p">{</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`Login first, or enter a WebID (any WebID!) to read from its profile`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">`red`</span><span class="p">;</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">try</span> <span class="p">{</span>
<span class="k">new</span> <span class="nx">URL</span><span class="p">(</span><span class="nx">webID</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">_</span><span class="p">)</span> <span class="p">{</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`Provided WebID [</span><span class="p">${</span><span class="nx">webID</span><span class="p">}</span><span class="s2">] is not a valid URL - please try again`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">`red`</span><span class="p">;</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// Profile is public data; i.e., you do not need to be logged in to read the data.</span>
<span class="c1">// For illustrative purposes, shows both an authenticated and non-authenticated reads.</span>
<span class="kd">let</span> <span class="nx">myDataset</span><span class="p">;</span>
<span class="k">try</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">session</span><span class="p">.</span><span class="nx">isLoggedIn</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">myDataset</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">getSolidDataset</span><span class="p">(</span><span class="nx">webID</span><span class="p">,</span> <span class="p">{</span><span class="na">fetch</span><span class="p">:</span> <span class="nx">session</span><span class="p">.</span><span class="nx">fetch</span><span class="p">});</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">myDataset</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">getSolidDataset</span><span class="p">(</span><span class="nx">webID</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`Entered value [</span><span class="p">${</span><span class="nx">webID</span><span class="p">}</span><span class="s2">] does not appear to be a WebID. Error: [</span><span class="p">${</span><span class="nx">error</span><span class="p">}</span><span class="s2">]`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">`red`</span><span class="p">;</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="kd">const</span> <span class="nx">profile</span> <span class="o">=</span> <span class="nx">getThing</span><span class="p">(</span><span class="nx">myDataset</span><span class="p">,</span> <span class="nx">webID</span><span class="p">);</span>
<span class="c1">// Get the formatted name (fn) using the property identifier "http://www.w3.org/2006/vcard/ns#fn".</span>
<span class="c1">// VCARD.fn object is a convenience object that includes the identifier string "http://www.w3.org/2006/vcard/ns#fn".</span>
<span class="c1">// As an alternative, you can pass in the "http://www.w3.org/2006/vcard/ns#fn" string instead of VCARD.fn.</span>
<span class="kd">const</span> <span class="nx">formattedName</span> <span class="o">=</span> <span class="nx">getStringNoLocale</span><span class="p">(</span><span class="nx">profile</span><span class="p">,</span> <span class="nx">VCARD</span><span class="p">.</span><span class="nx">fn</span><span class="p">);</span>
<span class="c1">// Update the page with the retrieved values.</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">`black`</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">labelFN</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`[</span><span class="p">${</span><span class="nx">formattedName</span><span class="p">}</span><span class="s2">]`</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">buttonLogin</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="nx">login</span><span class="p">();</span>
<span class="p">};</span>
<span class="nx">buttonWrite</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="nx">writeProfile</span><span class="p">();</span>
<span class="p">};</span>
<span class="nx">buttonRead</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="nx">readProfile</span><span class="p">();</span>
<span class="p">};</span>
</code></pre></div> </div>
</li>
</ul>
<p><strong>NOTE:</strong> If your Pod is not on <code class="language-plaintext highlighter-rouge">https://solidcommunity.net</code>, modify the
value of the <code class="language-plaintext highlighter-rouge">IDENTITY_PROVIDER</code> variable accordingly.</p>
</li>
<li>
<p>Run the Application:</p>
<ul>
<li>
<p>In the <code class="language-plaintext highlighter-rouge">my-demo-app</code> directory, run:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> npx parcel index.html
</code></pre></div> </div>
<p>The output should resemble the following:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Server running at http://localhost:1234
...
Built <span class="k">in </span>2ms.
</code></pre></div> </div>
<p>If there are warnings with regards to the various source maps, you
can safely ignore them.</p>
</li>
</ul>
</li>
<li>
<p>Open <code class="language-plaintext highlighter-rouge">localhost:1234</code> in a browser. If you want, you can also check out the running app on CodeSandbox. Note that you’ll have to open the app in a new window (button in the upper right hand corner) to be able to log in.<span>
<a href="https://codesandbox.io/s/musing-bouman-n1ghd"><img src="/assets/img/play-codesandbox.svg" alt="Edit on CodeSandbox" /></a>
</span></p>
</li>
<li>
<p>Login.</p>
<ul>
<li>
<p>Click <code class="language-plaintext highlighter-rouge">Login</code> to login.</p>
</li>
<li>
<p>If you have logged out of your Pod, you are prompted to log in.
Enter your username and password to log in.</p>
</li>
<li>
<p>The first time you log into your Pod with this brand new application you
just created, you’ll be prompted to authorize it to access your Pod (it’ll
be named <code class="language-plaintext highlighter-rouge">http://localhost:1234</code>). To allow the application to read and
write to your Pod, click <code class="language-plaintext highlighter-rouge">Authorize</code>.</p>
</li>
<li>
<p>You should be redirected back to our client application.</p>
<p><strong>NOTE:</strong> If you encounter redirect issues trying to log in, you may
need to clear your browser’s cache.</p>
</li>
<li>
<p>You should now see a message telling you:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Your session is logged in with the WebID [&lt;your WebID&gt;].
</code></pre></div> </div>
</li>
</ul>
</li>
<li>
<p>Now that you’re logged in, you can freely read and write the information in
your Solid profile.</p>
<ul>
<li>Let’s start by simply clicking the <code class="language-plaintext highlighter-rouge">Read Profile</code> button.
<ul>
<li>You should see the name you entered when you registered your Pod.</li>
</ul>
</li>
<li>Now let’s update your name. Simply enter a new name in the ‘2. Write your
name’ textfield, and click the ‘Write to Profile’ button.
<ul>
<li>You should see the message:
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Wrote [&lt;your new name&gt;] as name successfully!
</code></pre></div> </div>
</li>
</ul>
</li>
<li>Now let’s verify that your profile really was updated by clicking again on
the ‘Read Profile’ button.
<ul>
<li>You should see the updated name displayed!</li>
</ul>
</li>
</ul>
<p>You can also read the public profiles of anyone else in the world with a
Solid Pod by simply entering their WebID into the text box of section 3;
e.g., <code class="language-plaintext highlighter-rouge">https://docs-example.inrupt.net/profile/card#me</code> (<strong>NOTE:</strong> If you do try that example WebID, you should see the name
<code class="language-plaintext highlighter-rouge">Changing Docs Example</code>!).</p>
</li>
<li>
<p>Exit the Application</p>
<ul>
<li>To exit the application, simply stop the <code class="language-plaintext highlighter-rouge">npx parcel</code> process; e.g.,
<code class="language-plaintext highlighter-rouge">Ctrl-C</code>.</li>
</ul>
</li>
</ol>
<h2 id="additional-information">Additional Information</h2>
<h4 id="api-documentation">API Documentation</h4>
<ul>
<li>
<p><a href="https://docs.inrupt.com/developer-tools/api/javascript/solid-client/README.html">solid-client API</a></p>
</li>
<li>
<p><a href="https://docs.inrupt.com/developer-tools/api/javascript/solid-client-authn-browser/README.html">solid-client-authn-browser API</a></p>
</li>
</ul>
<h4 id="react-sdk-availability">React SDK Availability</h4>
<p>To create a sample application using Inrupt’s Solid React SDK, refer to the
<a href="https://docs.inrupt.com/developer-tools/javascript/react-sdk/">Solid React SDK documentation</a></p></content><author><name></name></author><category term="apps" /><summary type="html">Getting Started</summary></entry><entry><title type="html">This Month in Solid 2020-10-01</title><link href="https://solidproject.org//newsletter/2020-10-01" rel="alternate" type="text/html" title="This Month in Solid 2020-10-01" /><published>2020-10-01T00:00:00+00:00</published><updated>2020-10-01T00:00:00+00:00</updated><id>https://solidproject.org//newsletter/this-month-in-solid</id><content type="html" xml:base="https://solidproject.org//newsletter/2020-10-01"><p>Hello and welcome to another edition of This Month in Solid!</p>
<p><a href="https://solidproject.org">Solid</a> is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along.</p>
<p>This is a monthly summary of Solid progress.</p>
<p>Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">on GitHub</a>. If you find any errors in this month’s issue please <a href="https://github.com/solid/solidproject.org/pulls">submit a pull request</a>.</p>
<h2 id="updates">Updates</h2>
<h3 id="events"><a href="https://solidproject.org/events">Events</a></h3>
<p>1 October 2020 - This month at Solid World we heard from a pair of guest presenters diving into the practicalities of building sophisticated, scalable Solid apps and services.</p>
<p>Justin Bingham, founder and CTO of <a href="https://www.janeirodigital.com/">Janeiro Digital</a>, presented their work with the National Health Service (NHS) in the United Kingdom. We learned how the NHS aims to improve patients’ access to their complete personal medical records, and their ability to share additional data with their doctors between their appointments to improve their overall health. With Solid, Janeiro Digital has built a solution that gives patients the control to access, share, and manage their medical information with various services there to help them.</p>
<p>Justin and Josh Collins, Janeiro Digital’s VP of Technology, highlighted how the company’s XFORM Health technology made it possible to integrate existing data silos into Solid Pods in a standardized, interoperable format. They also demonstrated the functional and intuitive patient-focused user interface they were able to build on top of this Pod data.</p>
<p>We also heard from one of Inrupt’s engineering leads, Jack Lawson, about their React SDK V2. To begin, he went over the three major components that make up the React SDK — authentication, visualization, and data syncing. Next, he discussed how the open source toolkit is meant to make it easy for developers to build Solid applications, avoiding stress over tedious details, offering a smooth implementation, and providing the opportunity to leverage Inrupt’s best practices and coding standards. Unfortunately, we ran out of time to see the demo, but plan to see in the near future!</p>
<p>If you missed Solid World you can look out for recordings of the guest presentations coming soon to <a href="https://vimeo.com/solidworld">our Vimeo page</a>. The next Solid World will take place on 5 November 2020. Follow along at <a href="https://solidproject.org/events">solidproject.org/events</a> as we finalize the agenda, which will highlight Solid-based projects from several industries and research areas.</p>
<p>28th September 2020 - “Solid - Citizens in control of their own data— A virtual event in which the Prime Minister of Flanders explains why the Flemish government is investigating the concept with great interest to improve its services. Information Flanders, Imec and Ghent University are organizing a theme afternoon about Solid in which they propose Flemish initiatives in the fields of culture and media, mobility and GovTech.</p>
<h3 id="press"><a href="https://solidproject.org/press">Press</a></h3>
<ul>
<li><a href="https://www.thedailybeast.com/one-simple-trick-to-fix-the-web-give-us-back-our-data">Daily Beast - One Simple Trick to Fix the Web: Give Us Back Our Data! by Ruben Verborgh</a></li>
</ul>
<h3 id="in-other-news">In Other News</h3>
<h4 id="solid-implementations">Solid Implementations</h4>
<ul>
<li>see an <a href="https://forum.solidproject.org/t/making-access-to-solid-pods-data-a-breeze-solideal-storage/3427">announcement</a> of <a href="https://github.com/solideal/storage">Solideal</a></li>
<li><a href="https://github.com/jeff-zucker/solid-file-client">solid-file-client v1.1.0</a> has been published. New functions have been added: 1) ACL builder class 2) zip/unzip. All delete functions includes auxiliary resources</li>
<li><a href="https://scenaristeur.github.io/solid-vue-panes/chat">PoPock</a> is a great chat app on Solid</li>
<li><a href="https://hubl.world/en/">Hubl</a>, a collaborative tools for distributed organization developed by <a href="https://startinblox.com/en/">Startin’blox</a>. It includes a chat, a job board, a skill directory and so many features are coming. Here is the <a href="https://git.startinblox.com/applications/hubl">code</a>, <a href="https://docs.startinblox.com">Startin’blox documentation</a> and if you want to meet us it’s on community.startinblox.com</li>
<li><a href="https://coopedia.starter.coop/en/">Coopedia</a>, collaborative search engine for cooperative entrepreneurship, built to inspire the next generation of cooperative entrepreneurs worldwide developed by <a href="https://startinblox.com/en/">Startin’blox</a>. Here is the <a href="https://coopseurope.coop/sites/default/files/Developer%20Pack%20Coopedia.pdf">developper pack</a>, <a href="https://docs.startinblox.com">Startin’blox documentation</a> and if you want to meet us it’s on community.startinblox.com</li>
</ul>
<h4 id="job-openings">Job Openings</h4>
<ul>
<li><a href="https://www.digita.ai/careers">Digita</a> is hiring a Full Stack Developer and a Linked Data Principal. Email tom@digita.ai for more information.</li>
<li><a href="https://inrupt.com/careers">Contact Inrupt careers</a></li>
<li>O Team is recruiting a ETL (Extract Transform Load) Engineer, a Linked Data Ontology Designer, and a JavaScript Developer. Email jobs@o.team for more information.</li>
</ul>
<h3 id="update-from-the-specification-editors">Update from the <a href="https://github.com/solid/process/blob/master/editors.md">Specification Editors</a></h3>
<p>The Solid Community Group’s https://github.com/solid/authorization-panel/ is collecting use cases (current state: https://solid.github.io/authorization-panel/wac-ucr/ ). There is also a survey to better understand stakeholders views and interest in the use cases whether they’ll implement or not. It will help us to prioritise on the requirements that the panel should work on. One does not need to be a spec implementer / developer to fill out the survey. It’d be even better to gather responses from a wide range of stakeholders to further identify privacy, security, and ethical concerns or real-world behaviour that we haven’t adequately looked into - I’m certain there are many. The survey is here: https://github.com/solid/authorization-panel/blob/master/proposals/wac-ucr/uc-survey.md and we are in the process of recording the responses eg. here is mine: https://github.com/solid/authorization-panel/pull/109/files based on my own views/interests/development . You can wear whatever hat you like. Share as much or as little as you want. The point is to help develop some insights and improve.
If you plan to respond in context of a product/project you’re working on, I’d suggest to coordinate with your team so that there is only one response to the survey based on that.
We are trying to also come out of the survey with a rough idea on ongoing implementations.. and whether a particular use case will have significant number of implementations when we push the spec(s) through roughly equivalent of Candidate Recommendation. We could even get a sense on why something is not supported eg. is it because it’d be hard to implement with a particular tool stack? Completely out of scope of needs? Any geopolitical restrictions? Ethical considerations? This is an open list of possibilities and the numbers alone don’t capture it. So, having a brief comment helps.</p></content><author><name></name></author><category term="monthly" /><category term="updates" /><summary type="html">Hello and welcome to another edition of This Month in Solid! Solid is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along. This is a monthly summary of Solid progress. Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed on GitHub. If you find any errors in this month’s issue please submit a pull request.</summary></entry><entry><title type="html">This Month in Solid 2020-09-03</title><link href="https://solidproject.org//newsletter/2020-09-03" rel="alternate" type="text/html" title="This Month in Solid 2020-09-03" /><published>2020-09-03T00:00:00+00:00</published><updated>2020-09-03T00:00:00+00:00</updated><id>https://solidproject.org//newsletter/this-month-in-solid</id><content type="html" xml:base="https://solidproject.org//newsletter/2020-09-03"><p>Hello and welcome to another edition of This Month in Solid!</p>
<p><a href="https://solidproject.org">Solid</a> is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along.</p>
<p>This is a monthly summary of Solid progress.</p>
<p>Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">on GitHub</a>. If you find any errors in this month’s issue please <a href="https://github.com/solid/solidproject.org/pulls">submit a pull request</a>.</p>
<h2 id="updates">Updates</h2>
<h3 id="events"><a href="https://solidproject.org/events">Events</a></h3>
<p>Solid World is an opportunity to meet people who are interested in or currently working with Solid.</p>
<p>This month’s agenda was jam-packed with surprise previews and big names.</p>
<p>Ruben Verborgh, professor of Semantic Web technology at Ghent University, gave us the first demo of the Community Solid Server his team has been building alongside community contributors. CSS is not yet ready for use or to develop apps against, but you can see the architecture and progress to date <a href="https://github.com/solid/community-server">on GitHub here</a>.</p>
<p>Max Leonard and Hannes Ricklefs from the BBC’s R&amp;D team shared the work they’ve been doing to improve content recommendations while respecting user privacy, all based on data in Solid Pods. They explained how Solid helps deliver on core pieces of BBC’s royal charter, and how the user-centric approach to data opens the door to all kinds of new services for their licensees.</p>
<p>Charlotte Sadd from NatWest Group showed a demonstration of how Solid Pods can put the bank at the center of its customers “life moments”, providing a single, trusted place to — for example — change their name or register a business. She shared the banks thoughts on how Solid can help it on its core mission to “champion the potential of people, families and businesses.”</p>
<p>Jackson Morgan, founder of O Team, gave a tour of ShapeRepo and how it supports the company’s mission that “All data should be interoperable.” Finally, Alex Bourlier, founder of Startin’blox, introduced us to Hubl, an open-source collaboration tool for freelancers, built on Solid.</p>
<p>If you missed Solid World you can <a href="https://vimeo.com/454813146">watch the recording here</a>. The next Solid World will happen on the 1st October 2020. Follow along <a href="http://solidproject.org/events">here</a> as we finalize the agenda, which will highlight Solid-based projects from several industries and research areas.</p>
<p>28th September 2020 - <a href="https://overheid.vlaanderen.be/opleiding/solid">“Solid - Citizens in control of their own data</a>— A virtual event in which the Prime Minister of Flanders explains why the Flemish government is investigating the concept with great interest to improve its services. Information Flanders, Imec and Ghent University are organizing a theme afternoon about Solid in which they propose Flemish initiatives in the fields of culture and media, mobility and GovTech.</p>
<h3 id="in-other-news">In Other News</h3>
<h4 id="solid-implementations">Solid Implementations</h4>
<ul>
<li>As Ruben Verborgh mentioned in Solid World, the Community Solid Server is making great strides. Not yet production-ready, but you can follow along or contribute <a href="https://github.com/solid/community-server">here</a>.</li>
<li>Inrupt announced the <a href="https://inrupt.com/inrupt-beta-live">Beta release</a> of the Enterprise Solid Server, Dev Toolkit, and PodBrowser.</li>
<li><a href="https://graphmetrix.com/trinpod">TrinPod</a> is an industrial strength Pod provider with conceptual computing through Trinity AI Capable of handling a massive amount of data. Available next month. <a href="https://graphmetrix.com/trinpod">Sign up now</a> for early access.</li>
<li><a href="https://github.com/KNowledgeOnWebScale/walder">Walder</a> is a content management system that can be driven by one or multiple Pods</li>
</ul>
<h4 id="funding">Funding</h4>
<ul>
<li><a href="https://ngiatlantic.eu/ngiatlanticeu-2nd-open-call">NGI Atlantic</a> - also check out the <a href="https://ngiatlantic.eu/twinning-lab?field_country_value=2&amp;field_organisation_type_value=All&amp;field_choose_the_ngi_topic_focus_value=All">NGI Twinning Lab</a></li>
</ul>
<h4 id="job-openings">Job Openings</h4>
<ul>
<li><a href="https://www.digita.ai/careers">Digita</a> is hiring a Full Stack Developer and a Linked Data Principal. Email tom@digita.ai for more information.</li>
<li><a href="https://inrupt.com/careers">Contact Inrupt careers</a></li>
</ul></content><author><name></name></author><category term="monthly" /><category term="updates" /><summary type="html">Hello and welcome to another edition of This Month in Solid! Solid is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along. This is a monthly summary of Solid progress. Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed on GitHub. If you find any errors in this month’s issue please submit a pull request.</summary></entry><entry><title type="html">Using Nginx as a reverse proxy</title><link href="https://solidproject.org//self-hosting/nss/nginx" rel="alternate" type="text/html" title="Using Nginx as a reverse proxy" /><published>2020-08-12T00:00:00+00:00</published><updated>2020-08-12T00:00:00+00:00</updated><id>https://solidproject.org//self-hosting/nss/00_nginx-config</id><content type="html" xml:base="https://solidproject.org//self-hosting/nss/nginx"><h1 id="using-nginx-as-a-reverse-proxy">Using Nginx as a Reverse Proxy</h1>
<p>Create or modify /etc/nginx/sites-available/default as follows (example editor nano)</p>
<p><code class="language-plaintext highlighter-rouge">$ nano /etc/nginx/sites-available/default</code></p>
<div class="language-nginx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Nginx configuration for Solid on Port 8443</span>
<span class="c1">## Redirects all HTTP traffic to the HTTPS host</span>
<span class="k">server</span> <span class="p">{</span>
<span class="c1">## In case of conflict, either remove "default_server" from the listen line below,</span>
<span class="c1">## or delete the /etc/nginx/sites-enabled/default file.</span>
<span class="kn">listen</span> <span class="nf">0.0.0.0</span><span class="p">:</span><span class="mi">80</span><span class="p">;</span>
<span class="kn">listen</span> <span class="s">[::]:80</span><span class="p">;</span>
<span class="kn">server_name</span> <span class="s">example.org</span><span class="p">;</span>
<span class="kn">server_tokens</span> <span class="no">off</span><span class="p">;</span> <span class="c1">## Don't show the nginx version number, a security best practice</span>
<span class="kn">return</span> <span class="mi">301</span> <span class="s">https://</span><span class="nv">$http_host$request_uri</span><span class="p">;</span>
<span class="kn">access_log</span> <span class="n">/var/log/nginx/solid_access.log</span><span class="p">;</span>
<span class="kn">error_log</span> <span class="n">/var/log/nginx/solid_error.log</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">server</span> <span class="p">{</span>
<span class="kn">listen</span> <span class="s">*:443</span> <span class="s">ssl</span><span class="p">;</span>
<span class="kn">listen</span> <span class="s">[::]:443</span> <span class="s">ssl</span><span class="p">;</span>
<span class="kn">server_name</span> <span class="s">example.org</span><span class="p">;</span>
<span class="kn">server_tokens</span> <span class="no">off</span><span class="p">;</span>
<span class="kn">access_log</span> <span class="n">/var/log/nginx/solid_ssl_access.log</span><span class="p">;</span>
<span class="kn">error_log</span> <span class="n">/var/log/nginx/solid_ssl_error.log</span><span class="p">;</span>
<span class="kn">ssl_certificate</span> <span class="n">/etc/letsencrypt/live/example.org/fullchain.pem</span><span class="p">;</span>
<span class="kn">ssl_certificate_key</span> <span class="n">/etc/letsencrypt/live/example.org/privkey.pem</span><span class="p">;</span>
<span class="kn">root</span> <span class="n">/var/www/example.org</span><span class="p">;</span> <span class="c1">#webroot</span>
<span class="c1">## [Optional] Enable HTTP Strict Transport Security</span>
<span class="c1">## HSTS is a feature improving protection against MITM attacks</span>
<span class="c1">## For more information see: https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/</span>
<span class="kn">add_header</span> <span class="s">Strict-Transport-Security</span> <span class="s">"max-age=31536000</span><span class="p">;</span> <span class="kn">includeSubDomains"</span><span class="p">;</span>
<span class="kn">location</span> <span class="n">/</span> <span class="p">{</span>
<span class="kn">proxy_pass</span> <span class="s">https://localhost:8443</span><span class="p">;</span>
<span class="kn">gzip</span> <span class="no">off</span><span class="p">;</span>
<span class="kn">proxy_redirect</span> <span class="no">off</span><span class="p">;</span>
<span class="c1">## Some requests take more than 30 seconds.</span>
<span class="kn">proxy_read_timeout</span> <span class="mi">300</span><span class="p">;</span>
<span class="kn">proxy_connect_timeout</span> <span class="mi">300</span><span class="p">;</span>
<span class="kn">proxy_redirect</span> <span class="no">off</span><span class="p">;</span>
<span class="kn">proxy_http_version</span> <span class="mi">1</span><span class="s">.1</span><span class="p">;</span>
<span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$http_host</span><span class="p">;</span>
<span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
<span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-Ssl</span> <span class="no">on</span><span class="p">;</span>
<span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
<span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-Proto</span> <span class="nv">$scheme</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">$ systemctl restart nginx</code></p></content><author><name></name></author><category term="pod-server" /><summary type="html">Using Nginx as a Reverse Proxy</summary></entry><entry><title type="html">This Month in Solid 2020-08-06</title><link href="https://solidproject.org//newsletter/2020-08-06" rel="alternate" type="text/html" title="This Month in Solid 2020-08-06" /><published>2020-08-06T00:00:00+00:00</published><updated>2020-08-06T00:00:00+00:00</updated><id>https://solidproject.org//newsletter/this-month-in-solid</id><content type="html" xml:base="https://solidproject.org//newsletter/2020-08-06"><p>Hello and welcome to another edition of This Month in Solid!</p>
<p><a href="https://solidproject.org">Solid</a> is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along.</p>
<p>This is a monthly summary of Solid progress.</p>
<p>Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">on GitHub</a>. If you find any errors in this month’s issue please <a href="https://github.com/solid/solidproject.org/pulls">submit a pull request</a>.</p>
<h2 id="updates">Updates</h2>
<h3 id="events"><a href="https://solidproject.org/events">Events</a></h3>
<p>Solid World is an opportunity to meet people who are interested in or currently working on Solid. If you missed Solid World you can <a href="https://vimeo.com/446435972">watch the recording here</a>.The <a href="https://www.eventbrite.com/e/solid-world-tickets-115477011851">next Solid World</a> will happen on the 3rd September 2020.</p>
<h3 id="articles-and-talks-mentioning-solid">Articles and Talks mentioning Solid</h3>
<ul>
<li><a href="https://time.com/5867314/we-need-to-change-how-we-share-our-personal-data-online-in-the-age-of-covid-19/">TIME - We Need to Change How We Share Our Personal Data Online in the Age of COVID-19</a></li>
<li><a href="https://yarmo.eu/post/future-online-identity-decentralized">The Future of Online Identity is Decentralized by Yarmo Mackenbach</a></li>
<li><a href="https://www.nrc.nl/nieuws/2020/07/28/tem-big-tech-stop-data-in-prive-kluizen-a4007191">Tem Big Tech: stop data in privékluizen</a></li>
<li><a href="https://websbigbuild.org">The Web’s Big Build</a></li>
<li><a href="https://medium.com/digital-diplomacy/digital-identity-as-an-investment-d6c2ef21431d">Digital Identity as an Investment</a></li>
<li><a href="https://www.technologyreview.com/2020/07/01/1004725/redesign-internet-apps-no-one-controls-data-privacy-innovation-cloud/">MIT Technology Review - A plan to redesign the internet could make apps that no one controls</a></li>
</ul>
<h3 id="in-other-news">In Other News</h3>
<p>This month, there’s been a website refresh, <a href="https://solidproject.org">check out the latest version of the website</a>. Anyone can make suggestions around how to improve the website by submitting an <a href="https://github.com/solid/solidproject.org/issues">issue</a> or <a href="https://github.com/solid/solidproject.org/pulls">pull request</a> for the <a href="https://github.com/solid/process/blob/master/creators.md">Creators</a> to process.</p>
<p><a href="https://www.linkedin.com/posts/empathyco_solidworld-activity-6685892403682979840-usNj">Check out</a> the winners of the Solid geolocation challenge at the Universidad de Oviedo.</p>
<h4 id="solid-implementations">Solid Implementations</h4>
<ul>
<li>Apart from the standardisation work happening in Solid GitHub there is also <a href="https://github.com/search?q=topic%3Arunning-code+fork%3Atrue+org%3Asolid&amp;type=Repositories">some running code</a>. There are currently three teams working on this running code which you can find <a href="https://github.com/orgs/solid/teams/running-code">listed here</a>. <a href="https://github.com/orgs/solid/teams/other">One of the three teams</a> is working on <a href="https://github.com/orgs/solid/teams/other/repositories">these repositories</a> of running code. If you are intersted in contributing to this running code you can find some good places to start in the column called ‘to try experiments’ of <a href="https://github.com/solid/mashlib/projects/1">this kanban board</a>.</li>
<li>Check out the new Solid app by <a href="https://noeldemartin.com">Noel De Martin</a> called <a href="https://noeldemartin.github.io/media-kraken/">Media Kraken</a> that let’s you track your media and never miss a beat. Read more on the <a href="https://github.com/NoelDeMartin/media-kraken/tree/main/docs">documentation</a> and <a href="https://github.com/NoelDeMartin/media-kraken">source code</a> which is under GNU General Public License v3.0 as well <a href="https://forum.solidproject.org/t/media-kraken-keep-track-of-your-media-in-your-pod/3333">this thread to discuss feedback</a>.</li>
</ul>
<h4 id="job-openings">Job Openings</h4>
<ul>
<li><a href="https://www.digita.ai/careers">Digita</a> is hiring a Full Stack Developer and a Linked Data Principal. Email tom@digita.ai for more information.</li>
<li><a href="https://inrupt.com/careers">Contact Inrupt careers</a></li>
</ul>
<h3 id="update-from-the-specification-editors">Update from the <a href="https://github.com/solid/process/blob/master/editors.md">Specification Editors</a></h3>
<ul>
<li>Key requirements pertaining to read and write operations are included in the Editors Draft: https://solid.github.io/specification/</li>
<li>Updates to Use Cases and Requirements for Authorization: https://github.com/solid/authorization-panel/blob/master/proposals/wac-ucr/index.bs and Data Interoperability: https://github.com/solid/data-interoperability-panel/blob/master/proposals/use-cases-and-requirements/index.bs</li>
<li>Progress on Proposals to Authentication: https://github.com/solid/authentication-panel/blob/master/oidc-authentication.md , Data Interop: https://github.com/solid/data-interoperability-panel/tree/master/proposals/ecosystem</li>
<li>General exchange concerning existing Authorization issues as well as considerations for new functionality: https://github.com/solid/authorization-panel/issues</li>
</ul>
<p>Join us in the W3C Solid Community Group. Links to activities are available at https://www.w3.org/community/solid/wiki/Main_Page</p></content><author><name></name></author><category term="monthly" /><category term="updates" /><summary type="html">Hello and welcome to another edition of This Month in Solid! Solid is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along. This is a monthly summary of Solid progress. Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed on GitHub. If you find any errors in this month’s issue please submit a pull request.</summary></entry><entry><title type="html">This Month in Solid 2020-07-02</title><link href="https://solidproject.org//newsletter/2020-07-02" rel="alternate" type="text/html" title="This Month in Solid 2020-07-02" /><published>2020-07-02T00:00:00+00:00</published><updated>2020-07-02T00:00:00+00:00</updated><id>https://solidproject.org//newsletter/this-month-in-solid</id><content type="html" xml:base="https://solidproject.org//newsletter/2020-07-02"><p>Hello and welcome to another edition of This Month in Solid!</p>
<p><a href="https://solidproject.org">Solid</a> is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along.</p>
<p>This is a monthly summary of Solid progress.</p>
<p>Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">on GitHub</a>. If you find any errors in this month’s issue please <a href="https://github.com/solid/solidproject.org/pulls">submit a pull request</a>.</p>
<h2 id="updates">Updates</h2>
<h3 id="events"><a href="https://solidproject.org/events">Events</a></h3>
<p>Solid World is an opportunity to meet people who are interested in or currently working on Solid.</p>
<p>If you missed Solid World you can <a href="https://vimeo.com/434767351">watch the recording here</a>.</p>
<p>This month, Solid Manager Mitzi László gave an overview of Solid as well as a mid-year recap. This was followed by a presentation by Sarven Capadisli on behalf of the Editors to give an overview of the specification progress this month. Two early companies to work on Solid introduced themselves and gave a quick update on what they are currently working on. Kelly O’Brien from Inrupt spoke about the UK COVID project with Open University and Kingsley Idehen introduced OpenLink.</p>
<p>The <a href="https://www.eventbrite.com/e/solid-world-tickets-111960609196">next Solid World</a> will happen on the 6th August 2020. If you have any content requests or would like to present at the next Solid world email info@solidproject.org.</p>
<h3 id="articles-and-talks-mentioning-solid">Articles and Talks mentioning Solid</h3>
<ul>
<li>2020-06-24 BBC Rethink <a href="https://www.bbc.co.uk/sounds/play/p08ht9tf">Tim Berners-Lee: Rethinking Digital Access</a></li>
</ul>
<h3 id="in-other-news">In Other News</h3>
<p>There’s a new category of <a href="https://forum.solidproject.org/c/local-solid-communities/37">conversations on the forum dedicated to local Solid communities</a>. If you would like to connect to others working or interested in Solid in your city of country, open a thread and describe what you are working on so others know where to find you.</p>
<h4 id="solid-implementations">Solid Implementations</h4>
<ul>
<li><a href="https://solid-groups.solidcommunity.net/">Solid Groups</a> app with open <a href="https://gitlab.com/angelo-v/solid-groups">source code</a></li>
<li><a href="https://scenaristeur.github.io/generator-smag/">Generator Smag</a></li>
<li>The Dutch cultural heritage institutions and the ministry of Education, Culture and Science are working together in a joined national digital heritage program (NDE) to enlarge the social relevance of the digital cultural heritage information created and maintained by these institutes. The activities of NDE are focused on improving the visibility, usability and sustainability of the available digital cultural heritage information. In general the larger organizations in the network are equipped with fairly modern collection management systems. The NDE works with the IT-suppliers of these systems to support newer functionality such as Linked Data technologies. But there is still a large group of smaller institutes and associations that lack functionality to share their information in a digital and modern way. The “Solid for small cultural heritage institutions project” is aimed at this group of organisations and will provide easy to use tools to maintain and publish their data on the web. By using Solid these organizations will stay in control of their own data and at the same time be fully compliant with the state-of-the-art web publishing standards that will improve the visibility, usability and sustainability of their information. The project is set out to demonstrate the feasibility of this approach and will run for one year.</li>
</ul>
<h4 id="job-openings">Job Openings</h4>
<ul>
<li><a href="https://www.digita.ai/careers">Digita</a> is hiring a Full Stack Developer and a Linked Data Principal. Email tom@digita.ai for more information.</li>
<li><a href="https://inrupt.com/careers">Contact Inrupt careers</a></li>
</ul>
<h3 id="update-from-the-specification-editors">Update from the <a href="https://github.com/solid/process/blob/master/editors.md">Specification Editors</a></h3>
<p>An <a href="https://forum.solidproject.org/t/interoperability-panel-june-update/3279">interoperability panel update</a> can be found on the fourum.</p></content><author><name></name></author><category term="monthly" /><category term="updates" /><summary type="html">Hello and welcome to another edition of This Month in Solid! Solid is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along. This is a monthly summary of Solid progress. Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed on GitHub. If you find any errors in this month’s issue please submit a pull request.</summary></entry><entry><title type="html">This Month in Solid 2020-06-04</title><link href="https://solidproject.org//newsletter/2020-06-04" rel="alternate" type="text/html" title="This Month in Solid 2020-06-04" /><published>2020-06-04T00:00:00+00:00</published><updated>2020-06-04T00:00:00+00:00</updated><id>https://solidproject.org//newsletter/this-month-in-solid</id><content type="html" xml:base="https://solidproject.org//newsletter/2020-06-04"><p>Hello and welcome to another edition of This Month in Solid!</p>
<p><a href="https://solidproject.org">Solid</a> is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along.</p>
<p>This is a monthly summary of Solid progress.</p>
<p>Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">on GitHub</a>. If you find any errors in this month’s issue please <a href="https://github.com/solid/solidproject.org/pulls">submit a pull request</a>.</p>
<h2 id="updates">Updates</h2>
<h3 id="events"><a href="https://solidproject.org/events">Events</a></h3>
<p>Solid World is an opportunity to meet people who are interested in or currently working on Solid.</p>
<p>This month the theme of Solid World was geolocation and Sharon Stratsianis kicked off with a talk on the benefits of Geolocation on Solid. The capstone project of her Masters of Information Technology and Distributed Computing at Melbourne University was on Semantic Web and Location Privacy.</p>
<p>Associate Professor <a href="http://labra.weso.es/">Jose Emilio Labra Gayo</a> directs the Web Semantics Reseach Group (WESO) at the Univesity of Oviedo. He explained how he taught approximately one hundred second year bachelor of engineering students how to build Solid apps and explained the course assignments the students were given.</p>
<p>In the third talk, Ángel Maldonado, founder and CEO of Empathy.co, introduced Empathy’s vision for decentralised commerce, as a platform that serves the consumers and not the brands, one that tracks, locates and profiles the store at the service of the consumer as well as the ongoing with work the University of Oviedo. Empathy serves brands such as Inditex, Kroger or Carrefour to connect with their consumers, humanly through Search, Navigation and UI Componentry.</p>
<p>Following the three talks there was the prize ceremony. You can watch the videos and see the code of the <a href="https://arquisoft.github.io/course1920.html#SolidChallen2020">entries for the Solid Geolocation challenge</a>.</p>
<p>A big congratulations to <a href="https://github.com/PabloCanalSuarez">Pablo Cañal Suárez</a>, <a href="https://github.com/gemarico">Gema Pozas Rico</a>, <a href="https://github.com/sktjpg">Guillermo de Leiva Martinez</a>, <a href="https://github.com/uo246355">Javier Pontón González</a>, <a href="https://github.com/lavanderaSonia">Sonia García Lavandera</a>, <a href="https://github.com/taniamato">Tania Mato Martínez</a>, and <a href="https://github.com/SaraGarcia13">Sara García Rodriguez</a> from teams <a href="https://www.youtube.com/watch?v=BLVFP_hg7c8">en3b1</a> and <a href="https://www.youtube.com/watch?v=ZxCeJe6TQVY">es3c</a> for winning the 2020 Solid Geolocation Challenge!</p>
<p>See the en3b1 <a href="https://github.com/Arquisoft/viade_en3b1">app</a>, <a href="https://www.youtube.com/watch?v=BLVFP_hg7c8">video</a>, <a href="https://github.com/Arquisoft/viade_en3b1">source code</a>, <a href="https://arquisoft.github.io/viade_en3b1/docs/">technical documentation</a>, and <a href="https://arquisoft.github.io/slides/course1920/labs/students/viade_en3b1.pdf">presentation</a>.</p>
<p>You can also see the es3c <a href="https://arquisoft.github.io/viade_es3c/#/login">app</a>, <a href="https://www.youtube.com/watch?v=ZxCeJe6TQVY">video</a>, <a href="https://github.com/Arquisoft/viade_es3c">source code</a>, <a href="https://arquisoft.github.io/viade_es3c/docs/">technical documentation</a>, and <a href="https://arquisoft.github.io/slides/course1920/labs/students/viade_es3c.pdf">presentation</a>.</p>
<p>If you missed Solid World you can <a href="https://vimeo.com/425919959">watch the recording here</a>.</p>
<p>The <a href="https://www.eventbrite.com/e/solid-world-tickets-108099311952">next Solid World</a> will happen on the 6th July 2020. If you have any content requests or would like to present at the next Solid world email info@solidproject.org.</p>
<h3 id="articles-and-talks-mentioning-solid">Articles and Talks mentioning Solid</h3>
<ul>
<li><a href="https://opencommons.org/solid/">Data privacy, trust, and smart city services</a> by Jeff Zucker</li>
<li><a href="https://blockchain.open.ac.uk/#covid-19">Open University Solid initiative</a></li>
<li><a href="https://alltechishuman.org/blog/changemakers-davi-ottenheimer-on-data-ethics-and-how-to-save-the-internet">CHANGEMAKERS: Davi Ottenheimer on Data Ethics and How to Save the Web</a> by Andrew Sears at All Tech is Human</li>
<li><a href="https://modeling-languages.com/low-code-open-source-platform-generative-objects/">Low-code development platform Generative Objects : the journey to open source</a> by Walter Almeida</li>
</ul>
<h3 id="in-other-news">In Other News</h3>
<h4 id="external-grants">External Grants</h4>
<p>Chek out the following initiatives which could be a possible match for your work with Solid:</p>
<ul>
<li><a href="https://forum.grantfortheweb.org/t/call-for-proposals-early-2020/959">Grant for the web</a></li>
<li><a href="https://dapsi.ngi.eu/">DAPSI</a></li>
<li><a href="https://www.ngi.eu/ngi-projects/ngi-pointer/">NGI Pointer</a></li>
</ul>
<p>If you know of more grants that could be interesting for the Solid community <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">submit a pull request</a> to let others know about it via the next edition.</p>
<h4 id="job-openings">Job Openings</h4>
<ul>
<li><a href="https://www.digita.ai/careers">Digita</a> is hiring a Full Stack Developer and a Linked Data Principal. Email tom@digita.ai for more information.</li>
</ul>
<h3 id="update-from-the-specification-editors">Update from the Specification Editors</h3>
<p>A Submission for
<a href="https://github.com/solid/specification/pull/160">Resource Type Heuristics</a>
has been merged into the
<a href="https://github.com/solid/specification">Editor’s Draft</a> of the upcoming
Solid protocol specification.</p>
<p>The editorial team has been holding productive monthly meetings
aimed at advancing progress towards normative Solid ecosystem specifications.
Minutes are posted in the
<a href="https://www.w3.org/community/solid/wiki/Meetings">Solid W3C Community Group Wiki</a>,
including <a href="https://www.w3.org/community/solid/wiki/Meetings#2020-05-15_1600CET">minutes</a>
from our May 15th session.</p>
<p>The <a href="https://github.com/solid/data-interoperability-panel">Interoperability Panel</a>
is working on a
<a href="https://github.com/solid/data-interoperability-panel/pull/41">Use Cases and Requirements</a>
document template that will be submitted to the
<a href="https://github.com/solid/specification">Specification</a> repository for the
submission and curation of UCRs, as well as making substantial progress on an
interoperable client ecosystem proposal, with a
<a href="https://github.com/solid/data-interoperability-panel/pull/42">recent submission</a>
detailing an approach for application registration.</p>
<p>Efforts are underway to
<a href="https://github.com/solid/process/issues/202">receive feedback and propose improvements</a> to
the way Solid Panels are organized and managed.</p>
<p>The Solid Project forum
<a href="https://forum.solidproject.org/t/updates-on-spec-related-activities-in-the-forum/3107">will be utilized more</a>
for communications and subsequent discussions on spec-related activities.</p></content><author><name></name></author><category term="monthly" /><category term="updates" /><summary type="html">Hello and welcome to another edition of This Month in Solid! Solid is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along. This is a monthly summary of Solid progress. Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed on GitHub. If you find any errors in this month’s issue please submit a pull request.</summary></entry><entry><title type="html">This Month in Solid 2020-05-07</title><link href="https://solidproject.org//newsletter/2020-05-07" rel="alternate" type="text/html" title="This Month in Solid 2020-05-07" /><published>2020-05-07T00:00:00+00:00</published><updated>2020-05-07T00:00:00+00:00</updated><id>https://solidproject.org//newsletter/this-month-in-solid</id><content type="html" xml:base="https://solidproject.org//newsletter/2020-05-07"><p>Hello and welcome to another edition of This Month in Solid!</p>
<p><a href="https://solidproject.org">Solid</a> is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along.</p>
<p>This is a monthly summary of Solid progress.</p>
<p>Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">on GitHub</a>. If you find any errors in this month’s issue please <a href="https://github.com/solid/solidproject.org/pulls">submit a pull request</a>.</p>
<h2 id="updates">Updates</h2>
<h3 id="events"><a href="https://solidproject.org/events">Events</a></h3>
<p>Solid World is an opportunity to meet people who are interested in or currently working on Solid.</p>
<p>A big thank you to Christian Buggedei, Walter Almeida, Glen Simister, Manoharan Ramachandran, and Michiel de Jong for presenting at Solid World May last Thursday.</p>
<p>In the first talk, Christian Buggedei presented Darcy, a social network that knows nothing about you. Of note, Darcy recently won a Mozilla grant. You can find the Darcy source code here. Christian Buggedei is a founder and technology expert.</p>
<p>In the second talk, Walter Almeida presented GO for modeling and generating Solid apps quickly with minimum code. He demonstrated the GO connector between Pod and SPARQL endpoints using a location tracking Solid app that leverages DBpedia as a data source for countries and places. You can find the <a href="https://github.com/walteralmeida/GOForSolidVisitedPlacesApplication/">Go location app source code on GitHub</a>.</p>
<p>In the third talk, Manoharan Ramachandran presented the Solid app built by Open University’s blockchain team, looking into how to support immunity passports as mentioned by the UK government daily briefings. The Solid app facilitates the instant verification of tamper-proof test results whilst preserving privacy.</p>
<p>In the fourth talk, Glen Simister presented the DVO Profile Manager, a public profile (or resume), which anyone can create for free, and update. DVO Profile Manager works in conjunction with the DVO Toolbar, a browser extension which allows people to like, dislike, and comment on any URL. You can find <a href="https://github.com/dvo/profile">the DVO Profile Manager source code on GitHub</a>.</p>
<p>In the fifth talk, Michiel de Jong presented his latest experiment, SNAP on Solid, explaining how Solid inboxes can be used as the messaging layer for Network Ledger Technology. Check out the <a href="https://github.com/ledgerloops/snap-solid/">SNAP source code on GitHub</a>.</p>
<p>If you missed Solid World you can <a href="https://vimeo.com/415976385">watch the recording on Vimeo</a>.</p>
<p>The <a href="https://www.eventbrite.com/e/solid-world-june-tickets-104631158612">next Solid World</a> will happen soon on the 4th June 2020. If you have any content requests or would like to present at the next Solid world email <a href="mailto:m.laszlo@inrupt.com">m.laszlo@inrupt.com</a>.</p>
<h3 id="articles-mentioning-solid">Articles mentioning Solid</h3>
<ul>
<li>2020-05-06 <a href="https://hackernoon.com/what-happens-when-you-get-sick-right-now-mh12x3y82">What Happens When You Get Sick Right Now?</a></li>
<li>2020-04-29 <a href="https://cointelegraph.com/news/new-app-for-covid-19-combines-blockchain-with-web-inventors-privacy-tech">New App for COVID-19 Combines Blockchain With Web Inventor’s Privacy Tech</a></li>
<li>2020-04-15 <a href="https://arxiv.org/abs/2004.07376">COVID-19 Antibody Test Certification: There’s an app for that</a></li>
<li>2020-04-14 <a href="https://www.zdnet.com/article/scale-distribution-and-occupying-mars-covid-19-is-a-catalyst/">Scale, distribution, and occupying Mars: COVID-19 is a catalyst</a></li>
</ul>
<h3 id="in-other-news">In Other News</h3>
<h4 id="solid-implementations">Solid Implementations</h4>
<ul>
<li><a href="https://github.com/jasonpaulos/solid-health">Solid Health</a></li>
<li><a href="https://dvo1.github.io/profile/index.html">DVO</a></li>
<li><a href="https://michiels-nlt-kit.herokuapp.com">Snap</a></li>
<li><a href="https://ibex.darcy.is/feed">Darcy</a></li>
</ul>
<h4 id="external-grants">External Grants</h4>
<p>There are EU initiatives <a href="https://dapsi.ngi.eu/">DAPSI</a> and <a href="https://www.ngi.eu/ngi-projects/ngi-pointer/">NGI Pointer</a> that could be suitable for Solid app projects.</p>
<p>If you know of more grants that could be interesting for the Solid community <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">submit a pull request</a> to let others know about it via the next edition.</p>
<h4 id="job-openings">Job Openings</h4>
<ul>
<li><a href="https://www.digita.ai/careers">Digita</a> is hiring a Full Stack Developer and a Linked Data Principal. Email tom@digita.ai for more information.</li>
<li><a href="https://inrupt.com/careers">Inrupt</a> is hiring a Technical Writer. Email jobs@inrupt.com for more information.</li>
</ul>
<h3 id="update-from-the-specification-editors">Update from the <a href="https://github.com/solid/process/blob/master/editors.md">Specification Editors</a></h3>
<p>A <a href="https://github.com/solid/specification/pull/156">Submission for Auxiliary Resources</a> has received editorial approval and has been merged into the <a href="https://github.com/solid/specification">Editor’s Draft</a> of the upcoming Solid protocol specification. An auxiliary resource may provide supplementary information about a given Solid resource, or affect how that resource and others associated with it are processed, served, or interpreted. This is the first (of several) candidate proposals from a <a href="https://github.com/solid/data-interoperability-panel">Solid panel</a> to make it into the editor’s draft.</p>
<p>A <a href="https://github.com/solid/specification/pull/157">Submission for Resource Access</a> has received editorial approval and has also been merged into the <a href="https://github.com/solid/specification">Editor’s Draft</a>. This submission provides clarity around containment of linked resources, shared slash semantics, and URI persistence.</p>
<p>The editorial team has been holding productive meetings every 2-3 weeks aimed at advancing progress towards normative Solid ecosystem specifications. Minutes are posted in the <a href="https://www.w3.org/community/solid/wiki/Meetings">Solid W3C Community Group Wiki</a>, including minutes from our meetings in April:</p>
<ul>
<li><a href="https://www.w3.org/community/solid/wiki/Meetings#2020-04-08T13:30:00Z">Minutes</a> from April 8th</li>
<li><a href="https://www.w3.org/community/solid/wiki/Meetings#2020-04-24_1600CET">Minutes</a> from April 24th</li>
</ul>
<p>Other notable activity related to the Solid specification include:</p>
<ul>
<li>A draft candidate proposal for WebID-OIDC is underway in the <a href="https://github.com/solid/authentication-panel">Authentication Panel</a> based on rough consensus agreement around key elements of the protocol needed to support the development of reference implementations.</li>
<li>Use cases for server managed auxiliary resources related to resource provenance, auditing, and access history are being undertaken in the <a href="https://github.com/solid/data-interoperability-panel">Data Interoperability Panel</a>.</li>
<li>Work towards a normative specification for <a href="https://github.com/solid/web-access-control-spec">Web Access Control</a> will begin soon, organized through the <a href="https://github.com/solid/authorization-and-access-control-panel">Authorization Panel</a>.</li>
<li><a href="https://github.com/solid/data-interoperability-panel/blob/master/problems-and-goals.md">Problems and Goals</a> for an interoperable Solid ecosystem have been published by the <a href="https://github.com/solid/data-interoperability-panel">Data Interoperability Panel</a>.</li>
</ul></content><author><name></name></author><category term="monthly" /><category term="updates" /><summary type="html">Hello and welcome to another edition of This Month in Solid! Solid is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along. This is a monthly summary of Solid progress. Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed on GitHub. If you find any errors in this month’s issue please submit a pull request.</summary></entry><entry><title type="html">This Month in Solid 2020-04-09</title><link href="https://solidproject.org//newsletter/2020-04-09" rel="alternate" type="text/html" title="This Month in Solid 2020-04-09" /><published>2020-04-09T00:00:00+00:00</published><updated>2020-04-09T00:00:00+00:00</updated><id>https://solidproject.org//newsletter/this-month-in-solid</id><content type="html" xml:base="https://solidproject.org//newsletter/2020-04-09"><p>Hello and welcome to another edition of This Month in Solid!</p>
<p><a href="https://solidproject.org">Solid</a> is a set of open specifications, built on existing open standards, that describes how to build applications in such a way that users can conveniently switch between data storage providers and application providers and take the data generated along.</p>
<p>This is a monthly summary of Solid progress.</p>
<p>Want something mentioned? Contact the Solid Manager at info@solidproject.org. This Month in Solid is openly developed <a href="https://github.com/solid/solidproject.org/blob/staging/_posts/newsletter/next.md">on GitHub</a>. If you find any errors in this month’s issue please <a href="https://github.com/solid/solidproject.org/pulls">submit a pull request</a>.</p>
<h2 id="updates">Updates</h2>
<h3 id="events"><a href="https://solidproject.org/events">Events</a></h3>
<p>Solid World is an opportunity to meet people who are interested in or currently working on Solid.</p>
<p>A big thank you to Travis Vachon, David Faveris, and Astrid Gamoneda for presenting at the first Solid World last Thursday. </p>
<p>In the first talk, <a href="https://github.com/travis">Travis Vachon</a> from the USA presented a Solid app called <a href="https://github.com/travis/concept">Concept</a>. Concept is a Google Docs equivalent that allows users to control their data. Travis built the concept with the aim to allow grassroots campaigns to organise themselves. Patch and WebSockets allowed for rudimentary collaborative editing, and now Travis wants to focus on embedding calendars and spreadsheets. </p>
<p>In the second talk, <a href="https://forum.solidproject.org/u/Smag0">David Faveris</a> from France presented a Solid app called <a href="https://github.com/scenaristeur/solidarity">Solidarity</a>. Solidarity is a chat app built using the Shighl library, which fills the gap between the Solidarity UI and Solid Pods. David worked closely with designer Julian Cole who has been working with Shighl to allow for easy installation and minimal dependencies while working with linked data. </p>