1diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
2index 236ac414a2ce8afb92d6c86bc64781a7f8189904..e0887497dfa2ec7d9284384ca6fcfc949b8609ca 100644
3--- a/pkg/handler/git/handler.go
4+++ b/pkg/handler/git/handler.go
5@@ -34,3 +34,8 @@
6 gitList := &templates.GitListPage{repos}
7 templates.WritePageTemplate(w, gitList)
8 }
9+
10+func (g *GitHandler) Item(w http.ResponseWriter, _ *http.Request) {
11+ gitList := &templates.GitItemPage{}
12+ templates.WritePageTemplate(w, gitList)
13+}
14diff --git a/pkg/handler/router.go b/pkg/handler/router.go
15index a8c9c6f227152e0602af3786f023508c563419d0..1150f2fd2ef5ee67eacd19f5a20d1c6d2b5150e4 100644
16--- a/pkg/handler/router.go
17+++ b/pkg/handler/router.go
18@@ -33,6 +33,7 @@ mux := http.NewServeMux()
19 mux.Handle("/static/", staticHandler)
20 mux.HandleFunc("/config", configHander)
21 mux.HandleFunc("/about", aboutHandler.About)
22+ mux.HandleFunc("/{name}", gitHandler.Item)
23 mux.HandleFunc("/", gitHandler.List)
24 return mux, nil
25 }
26diff --git a/scss/main.scss b/scss/main.scss
27index f57579ac37605a06ed15ba86c2f689c926d07f4c..deea23b381c4ce957482bdf81c2d71ecdb0972dc 100644
28--- a/scss/main.scss
29+++ b/scss/main.scss
30@@ -60,3 +60,8 @@ }
31 .event > p {
32 margin: 0.5rem 0;
33 }
34+
35+.code-view {
36+ display: grid;
37+ overflow-x: auto;
38+}
39diff --git a/templates/config.qtpl b/templates/config.qtpl
40index c5146b8b015513ceeec3fe0bcaf42c3301380309..b3df50eccb2571a37adfd630c7437caebdf1eb5e 100644
41--- a/templates/config.qtpl
42+++ b/templates/config.qtpl
43@@ -9,7 +9,10 @@
44 {% func (p *ConfigPage) Navbar() %}{%= Navbar(Config) %}{% endfunc %}
45
46 {% func (p *ConfigPage) Content() %}
47+<p>This is the configuration that is currently loaded</p>
48+<div class="code-view">
49 {%z= p.Body %}
50+</div>
51 {% endfunc %}
52
53 {% func (p *ConfigPage) Script() %}
54diff --git a/templates/config.qtpl.go b/templates/config.qtpl.go
55index a5df086e3ce1d3f9f186b3fb28aea4659db0649c..58b3881dbe2f792160c905f25a90783743b442b2 100644
56--- a/templates/config.qtpl.go
57+++ b/templates/config.qtpl.go
58@@ -92,71 +92,74 @@ //line config.qtpl:11
59 func (p *ConfigPage) StreamContent(qw422016 *qt422016.Writer) {
60 //line config.qtpl:11
61 qw422016.N().S(`
62+<p>This is the configuration that is currently loaded</p>
63+<div class="code-view">
64 `)
65-//line config.qtpl:12
66+//line config.qtpl:14
67 qw422016.N().Z(p.Body)
68-//line config.qtpl:12
69+//line config.qtpl:14
70 qw422016.N().S(`
71+</div>
72 `)
73-//line config.qtpl:13
74+//line config.qtpl:16
75 }
76
77-//line config.qtpl:13
78+//line config.qtpl:16
79 func (p *ConfigPage) WriteContent(qq422016 qtio422016.Writer) {
80-//line config.qtpl:13
81+//line config.qtpl:16
82 qw422016 := qt422016.AcquireWriter(qq422016)
83-//line config.qtpl:13
84+//line config.qtpl:16
85 p.StreamContent(qw422016)
86-//line config.qtpl:13
87+//line config.qtpl:16
88 qt422016.ReleaseWriter(qw422016)
89-//line config.qtpl:13
90+//line config.qtpl:16
91 }
92
93-//line config.qtpl:13
94+//line config.qtpl:16
95 func (p *ConfigPage) Content() string {
96-//line config.qtpl:13
97+//line config.qtpl:16
98 qb422016 := qt422016.AcquireByteBuffer()
99-//line config.qtpl:13
100+//line config.qtpl:16
101 p.WriteContent(qb422016)
102-//line config.qtpl:13
103+//line config.qtpl:16
104 qs422016 := string(qb422016.B)
105-//line config.qtpl:13
106+//line config.qtpl:16
107 qt422016.ReleaseByteBuffer(qb422016)
108-//line config.qtpl:13
109+//line config.qtpl:16
110 return qs422016
111-//line config.qtpl:13
112+//line config.qtpl:16
113 }
114
115-//line config.qtpl:15
116+//line config.qtpl:18
117 func (p *ConfigPage) StreamScript(qw422016 *qt422016.Writer) {
118-//line config.qtpl:15
119+//line config.qtpl:18
120 qw422016.N().S(`
121 `)
122-//line config.qtpl:16
123+//line config.qtpl:19
124 }
125
126-//line config.qtpl:16
127+//line config.qtpl:19
128 func (p *ConfigPage) WriteScript(qq422016 qtio422016.Writer) {
129-//line config.qtpl:16
130+//line config.qtpl:19
131 qw422016 := qt422016.AcquireWriter(qq422016)
132-//line config.qtpl:16
133+//line config.qtpl:19
134 p.StreamScript(qw422016)
135-//line config.qtpl:16
136+//line config.qtpl:19
137 qt422016.ReleaseWriter(qw422016)
138-//line config.qtpl:16
139+//line config.qtpl:19
140 }
141
142-//line config.qtpl:16
143+//line config.qtpl:19
144 func (p *ConfigPage) Script() string {
145-//line config.qtpl:16
146+//line config.qtpl:19
147 qb422016 := qt422016.AcquireByteBuffer()
148-//line config.qtpl:16
149+//line config.qtpl:19
150 p.WriteScript(qb422016)
151-//line config.qtpl:16
152+//line config.qtpl:19
153 qs422016 := string(qb422016.B)
154-//line config.qtpl:16
155+//line config.qtpl:19
156 qt422016.ReleaseByteBuffer(qb422016)
157-//line config.qtpl:16
158+//line config.qtpl:19
159 return qs422016
160-//line config.qtpl:16
161+//line config.qtpl:19
162 }
163diff --git a/templates/gititem.qtpl b/templates/gititem.qtpl
164new file mode 100644
165index 0000000000000000000000000000000000000000..156325fbd57ebd0af7e29796862108bb9d178e10
166--- /dev/null
167+++ b/templates/gititem.qtpl
168@@ -0,0 +1,48 @@
169+{% code
170+type GitItemPage struct {
171+}
172+%}
173+
174+
175+{% func insertIfEqual(s, d Selection) %}{% if s == d %} selected{% endif %}{% endfunc %}
176+
177+
178+{% func Navbar (s Selection) %}
179+ <nav class="container navbar navbar-expand">
180+ <div class="navbar-nav">
181+ <a class="nav-link{%= insertIfEqual(s, Git) %}" href="/">git</a>
182+ <a class="nav-link{%= insertIfEqual(s, List) %}" href="/list">list</a>
183+ <a class="nav-link{%= insertIfEqual(s, About) %}" href="/about">about</a>
184+ <a class="nav-link{%= insertIfEqual(s, Config) %}" href="/config">config</a>
185+ </div>
186+ </nav>
187+{% endfunc %}
188+
189+{% func (p *GitItemPage) Title() %}Git | List{% endfunc %}
190+
191+{% func (p *GitItemPage) Navbar() %}{%= Navbar(Git) %}{% endfunc %}
192+
193+{% func (p *GitItemPage) Content() %}
194+<div class="row">
195+ <h3>AoC2022.git</h3>
196+</div>
197+<div class="row">
198+ <ul class="nav">
199+ <li class="nav-item">
200+ <a class="nav-link" aria-current="page" href="#">about</a>
201+ </li>
202+ <li class="nav-item">
203+ <a class="nav-link" aria-current="page" href="#">summary</a>
204+ </li>
205+ <li class="nav-item">
206+ <a class="nav-link" aria-current="page" href="#">refs</a>
207+ </li>
208+ <li class="nav-item">
209+ <a class="nav-link" aria-current="page" href="#">tree</a>
210+ </li>
211+ </ul>
212+</div>
213+{% endfunc %}
214+
215+{% func (p *GitItemPage) Script() %}
216+{% endfunc %}
217diff --git a/templates/gititem.qtpl.go b/templates/gititem.qtpl.go
218new file mode 100644
219index 0000000000000000000000000000000000000000..8c1485689eaf1259154bc9e349c447549a3b24c4
220--- /dev/null
221+++ b/templates/gititem.qtpl.go
222@@ -0,0 +1,175 @@
223+// Code generated by qtc from "gititem.qtpl". DO NOT EDIT.
224+// See https://github.com/valyala/quicktemplate for details.
225+
226+//line gititem.qtpl:1
227+package templates
228+
229+//line gititem.qtpl:1
230+import (
231+ qtio422016 "io"
232+
233+ qt422016 "github.com/valyala/quicktemplate"
234+)
235+
236+//line gititem.qtpl:1
237+var (
238+ _ = qtio422016.Copy
239+ _ = qt422016.AcquireByteBuffer
240+)
241+
242+//line gititem.qtpl:2
243+type GitItemPage struct {
244+}
245+
246+//line gititem.qtpl:6
247+func (p *GitItemPage) StreamTitle(qw422016 *qt422016.Writer) {
248+//line gititem.qtpl:6
249+ qw422016.N().S(`Git | List`)
250+//line gititem.qtpl:6
251+}
252+
253+//line gititem.qtpl:6
254+func (p *GitItemPage) WriteTitle(qq422016 qtio422016.Writer) {
255+//line gititem.qtpl:6
256+ qw422016 := qt422016.AcquireWriter(qq422016)
257+//line gititem.qtpl:6
258+ p.StreamTitle(qw422016)
259+//line gititem.qtpl:6
260+ qt422016.ReleaseWriter(qw422016)
261+//line gititem.qtpl:6
262+}
263+
264+//line gititem.qtpl:6
265+func (p *GitItemPage) Title() string {
266+//line gititem.qtpl:6
267+ qb422016 := qt422016.AcquireByteBuffer()
268+//line gititem.qtpl:6
269+ p.WriteTitle(qb422016)
270+//line gititem.qtpl:6
271+ qs422016 := string(qb422016.B)
272+//line gititem.qtpl:6
273+ qt422016.ReleaseByteBuffer(qb422016)
274+//line gititem.qtpl:6
275+ return qs422016
276+//line gititem.qtpl:6
277+}
278+
279+//line gititem.qtpl:8
280+func (p *GitItemPage) StreamNavbar(qw422016 *qt422016.Writer) {
281+//line gititem.qtpl:8
282+ StreamNavbar(qw422016, Git)
283+//line gititem.qtpl:8
284+}
285+
286+//line gititem.qtpl:8
287+func (p *GitItemPage) WriteNavbar(qq422016 qtio422016.Writer) {
288+//line gititem.qtpl:8
289+ qw422016 := qt422016.AcquireWriter(qq422016)
290+//line gititem.qtpl:8
291+ p.StreamNavbar(qw422016)
292+//line gititem.qtpl:8
293+ qt422016.ReleaseWriter(qw422016)
294+//line gititem.qtpl:8
295+}
296+
297+//line gititem.qtpl:8
298+func (p *GitItemPage) Navbar() string {
299+//line gititem.qtpl:8
300+ qb422016 := qt422016.AcquireByteBuffer()
301+//line gititem.qtpl:8
302+ p.WriteNavbar(qb422016)
303+//line gititem.qtpl:8
304+ qs422016 := string(qb422016.B)
305+//line gititem.qtpl:8
306+ qt422016.ReleaseByteBuffer(qb422016)
307+//line gititem.qtpl:8
308+ return qs422016
309+//line gititem.qtpl:8
310+}
311+
312+//line gititem.qtpl:10
313+func (p *GitItemPage) StreamContent(qw422016 *qt422016.Writer) {
314+//line gititem.qtpl:10
315+ qw422016.N().S(`
316+<div class="row">
317+ <h3>AoC2022.git</h3>
318+</div>
319+<div class="row">
320+ <ul class="nav">
321+ <li class="nav-item">
322+ <a class="nav-link" aria-current="page" href="#">about</a>
323+ </li>
324+ <li class="nav-item">
325+ <a class="nav-link" aria-current="page" href="#">summary</a>
326+ </li>
327+ <li class="nav-item">
328+ <a class="nav-link" aria-current="page" href="#">refs</a>
329+ </li>
330+ <li class="nav-item">
331+ <a class="nav-link" aria-current="page" href="#">tree</a>
332+ </li>
333+ </ul>
334+</div>
335+`)
336+//line gititem.qtpl:30
337+}
338+
339+//line gititem.qtpl:30
340+func (p *GitItemPage) WriteContent(qq422016 qtio422016.Writer) {
341+//line gititem.qtpl:30
342+ qw422016 := qt422016.AcquireWriter(qq422016)
343+//line gititem.qtpl:30
344+ p.StreamContent(qw422016)
345+//line gititem.qtpl:30
346+ qt422016.ReleaseWriter(qw422016)
347+//line gititem.qtpl:30
348+}
349+
350+//line gititem.qtpl:30
351+func (p *GitItemPage) Content() string {
352+//line gititem.qtpl:30
353+ qb422016 := qt422016.AcquireByteBuffer()
354+//line gititem.qtpl:30
355+ p.WriteContent(qb422016)
356+//line gititem.qtpl:30
357+ qs422016 := string(qb422016.B)
358+//line gititem.qtpl:30
359+ qt422016.ReleaseByteBuffer(qb422016)
360+//line gititem.qtpl:30
361+ return qs422016
362+//line gititem.qtpl:30
363+}
364+
365+//line gititem.qtpl:32
366+func (p *GitItemPage) StreamScript(qw422016 *qt422016.Writer) {
367+//line gititem.qtpl:32
368+ qw422016.N().S(`
369+`)
370+//line gititem.qtpl:33
371+}
372+
373+//line gititem.qtpl:33
374+func (p *GitItemPage) WriteScript(qq422016 qtio422016.Writer) {
375+//line gititem.qtpl:33
376+ qw422016 := qt422016.AcquireWriter(qq422016)
377+//line gititem.qtpl:33
378+ p.StreamScript(qw422016)
379+//line gititem.qtpl:33
380+ qt422016.ReleaseWriter(qw422016)
381+//line gititem.qtpl:33
382+}
383+
384+//line gititem.qtpl:33
385+func (p *GitItemPage) Script() string {
386+//line gititem.qtpl:33
387+ qb422016 := qt422016.AcquireByteBuffer()
388+//line gititem.qtpl:33
389+ p.WriteScript(qb422016)
390+//line gititem.qtpl:33
391+ qs422016 := string(qb422016.B)
392+//line gititem.qtpl:33
393+ qt422016.ReleaseByteBuffer(qb422016)
394+//line gititem.qtpl:33
395+ return qs422016
396+//line gititem.qtpl:33
397+}
398diff --git a/templates/gitlist.qtpl b/templates/gitlist.qtpl
399index 588c26460e2549a7a8164dc5d6ee467a12329dd2..e07f1995c4d85f7bfb9cba27449d07888165659d 100644
400--- a/templates/gitlist.qtpl
401+++ b/templates/gitlist.qtpl
402@@ -22,6 +22,7 @@ </h4>
403 </hr>
404 <p>{%s r.LastCommitMessage %}</p>
405 <p><small>{%s r.LastCommitDate %}</small></p>
406+ <p><a href="#">summary</a> <a href="#">log</a> <a href="#">tree</a></p>
407 </div>
408 {% endfor %}
409 </div>
410diff --git a/templates/gitlist.qtpl.go b/templates/gitlist.qtpl.go
411index 54387293127fea06b93cde8fe006eb4e3223430e..130db5db65c14b25974beedf203f3b52cd1d7d4b 100644
412--- a/templates/gitlist.qtpl.go
413+++ b/templates/gitlist.qtpl.go
414@@ -126,77 +126,78 @@ //line gitlist.qtpl:24
415 qw422016.E().S(r.LastCommitDate)
416 //line gitlist.qtpl:24
417 qw422016.N().S(`</small></p>
418+ <p><a href="#">summary</a> <a href="#">log</a> <a href="#">tree</a></p>
419 </div>
420 `)
421-//line gitlist.qtpl:26
422+//line gitlist.qtpl:27
423 }
424-//line gitlist.qtpl:26
425+//line gitlist.qtpl:27
426 qw422016.N().S(`
427 </div>
428 `)
429-//line gitlist.qtpl:28
430+//line gitlist.qtpl:29
431 }
432
433-//line gitlist.qtpl:28
434+//line gitlist.qtpl:29
435 func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer) {
436-//line gitlist.qtpl:28
437+//line gitlist.qtpl:29
438 qw422016 := qt422016.AcquireWriter(qq422016)
439-//line gitlist.qtpl:28
440+//line gitlist.qtpl:29
441 p.StreamContent(qw422016)
442-//line gitlist.qtpl:28
443+//line gitlist.qtpl:29
444 qt422016.ReleaseWriter(qw422016)
445-//line gitlist.qtpl:28
446+//line gitlist.qtpl:29
447 }
448
449-//line gitlist.qtpl:28
450+//line gitlist.qtpl:29
451 func (p *GitListPage) Content() string {
452-//line gitlist.qtpl:28
453+//line gitlist.qtpl:29
454 qb422016 := qt422016.AcquireByteBuffer()
455-//line gitlist.qtpl:28
456+//line gitlist.qtpl:29
457 p.WriteContent(qb422016)
458-//line gitlist.qtpl:28
459+//line gitlist.qtpl:29
460 qs422016 := string(qb422016.B)
461-//line gitlist.qtpl:28
462+//line gitlist.qtpl:29
463 qt422016.ReleaseByteBuffer(qb422016)
464-//line gitlist.qtpl:28
465+//line gitlist.qtpl:29
466 return qs422016
467-//line gitlist.qtpl:28
468+//line gitlist.qtpl:29
469 }
470
471 // </div>
472 // </div>
473 //
474
475-//line gitlist.qtpl:32
476+//line gitlist.qtpl:33
477 func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer) {
478-//line gitlist.qtpl:32
479+//line gitlist.qtpl:33
480 qw422016.N().S(`
481 `)
482-//line gitlist.qtpl:33
483+//line gitlist.qtpl:34
484 }
485
486-//line gitlist.qtpl:33
487+//line gitlist.qtpl:34
488 func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer) {
489-//line gitlist.qtpl:33
490+//line gitlist.qtpl:34
491 qw422016 := qt422016.AcquireWriter(qq422016)
492-//line gitlist.qtpl:33
493+//line gitlist.qtpl:34
494 p.StreamScript(qw422016)
495-//line gitlist.qtpl:33
496+//line gitlist.qtpl:34
497 qt422016.ReleaseWriter(qw422016)
498-//line gitlist.qtpl:33
499+//line gitlist.qtpl:34
500 }
501
502-//line gitlist.qtpl:33
503+//line gitlist.qtpl:34
504 func (p *GitListPage) Script() string {
505-//line gitlist.qtpl:33
506+//line gitlist.qtpl:34
507 qb422016 := qt422016.AcquireByteBuffer()
508-//line gitlist.qtpl:33
509+//line gitlist.qtpl:34
510 p.WriteScript(qb422016)
511-//line gitlist.qtpl:33
512+//line gitlist.qtpl:34
513 qs422016 := string(qb422016.B)
514-//line gitlist.qtpl:33
515+//line gitlist.qtpl:34
516 qt422016.ReleaseByteBuffer(qb422016)
517-//line gitlist.qtpl:33
518+//line gitlist.qtpl:34
519 return qs422016
520-//line gitlist.qtpl:33
521+//line gitlist.qtpl:34
522 }
523diff --git a/templates/navbar.qtpl b/templates/navbar.qtpl
524index 26991a37dd96d09dc51cfe7366aea56aceed8828..636c619eaafe24b6bb4ce5bc975a7ad37627ff8c 100644
525--- a/templates/navbar.qtpl
526+++ b/templates/navbar.qtpl
527@@ -12,9 +12,9 @@ {% func insertIfEqual(s, d Selection) %}{% if s == d %} selected{% endif %}{% endfunc %}
528
529
530 {% func Navbar (s Selection) %}
531- <nav class="container navbar navbar-expand-sm">
532+ <nav class="container navbar navbar-expand">
533 <div class="navbar-nav">
534- <a class="nav-link{%= insertIfEqual(s, Git) %}" href="/git">git</a>
535+ <a class="nav-link{%= insertIfEqual(s, Git) %}" href="/">git</a>
536 <a class="nav-link{%= insertIfEqual(s, List) %}" href="/list">list</a>
537 <a class="nav-link{%= insertIfEqual(s, About) %}" href="/about">about</a>
538 <a class="nav-link{%= insertIfEqual(s, Config) %}" href="/config">config</a>
539diff --git a/templates/navbar.qtpl.go b/templates/navbar.qtpl.go
540index e2b738ccae4df0a80353a23aa195a6099cbde6cc..1caade28b3bdef1ce61682b3e130bb2f535da334 100644
541--- a/templates/navbar.qtpl.go
542+++ b/templates/navbar.qtpl.go
543@@ -68,13 +68,13 @@ //line navbar.qtpl:14
544 func StreamNavbar(qw422016 *qt422016.Writer, s Selection) {
545 //line navbar.qtpl:14
546 qw422016.N().S(`
547- <nav class="container navbar navbar-expand-sm">
548+ <nav class="container navbar navbar-expand">
549 <div class="navbar-nav">
550 <a class="nav-link`)
551 //line navbar.qtpl:17
552 streaminsertIfEqual(qw422016, s, Git)
553 //line navbar.qtpl:17
554- qw422016.N().S(`" href="/git">git</a>
555+ qw422016.N().S(`" href="/">git</a>
556 <a class="nav-link`)
557 //line navbar.qtpl:18
558 streaminsertIfEqual(qw422016, s, List)