throw new ModelNotFoundException();
        }
 
+       public function webIndex() {
+               return view('app')
+                       ->with('title', __('pages.events.title'))
+                       ->with('description', __('pages.events.description'))
+                       ->with('image', url('/media/alttp/events.png'));
+       }
+
 }
 
                throw new ModelNotFoundException();
        }
 
+       public function webIndex() {
+               return view('app')
+                       ->with('title', __('pages.tech.title'))
+                       ->with('description', __('pages.tech.description'))
+                       ->with('image', url('/media/alttp/tech.png'));
+       }
+
        private function applyLocalizedValues($validatedData, $content) {
                foreach (['attribution', 'description', 'short', 'title'] as $name) {
                        if (isset($validatedData[$name])) {
 
--- /dev/null
+<?php
+
+return [
+
+       'events' => [
+               'title' => 'Veranstaltungen',
+               'description' => 'Speedrun und Randomizer Veranstaltungen für A Link to the Past',
+       ],
+
+       'tech' => [
+               'title' => 'Techniken',
+               'description' => 'Tricks und Tutorials für A Link to the Past',
+       ],
+
+];
 
--- /dev/null
+<?php
+
+return [
+
+       'events' => [
+               'title' => 'Events',
+               'description' => 'Speedrun and randomizer events for A Link to the Past',
+       ],
+
+       'tech' => [
+               'title' => 'Techniques',
+               'description' => 'Tricks and tutorials for A Link to the Past',
+       ],
+
+];
 
                },
                events: {
                        concluded: 'Diese Veranstaltung is abgeschlossen.',
+                       description: 'Speedrun und Randomizer Veranstaltungen für A Link to the Past',
                        end: 'Ende',
                        evergreen: 'Ständige Veranstaltungen',
                        heading: 'Veranstaltungen',
 
                },
                events: {
                        concluded: 'This event has concluded.',
+                       description: 'Speedrun and randomizer events for A Link to the Past',
                        end: 'End',
                        evergreen: 'Evergreen events',
                        heading: 'Events',
 
 
        return <ErrorBoundary>
                <Helmet>
-                       <title>
-                               {t('events.heading')}
-                       </title>
+                       <title>{t('events.heading')}</title>
+                       <meta name="description" content={t('events.description')} />
+                       <meta property="og:image" content="/media/alttp/events.png" />
+                       <meta property="twitter:image" content="/media/alttp/events.png" />
                </Helmet>
                <CanonicalLinks base={`/events`} />
                <Container>
 
                <Row>
                        <Col sm={6}>
                                <Link className="front-panel" to="/events">
-                                       <Image alt="" className="image" src="/media/alttp/front.png" />
+                                       <Image alt="" className="image" src="/media/alttp/events.png" />
                                        <div className="title">
                                                {t('front.eventlist')}
                                        </div>
                <Row>
                        <Col sm={6}>
                                <Link className="front-panel" to="/tech">
-                                       <Image alt="" className="image" src="/media/alttp/front.png" />
+                                       <Image alt="" className="image" src="/media/alttp/tech.png" />
                                        <div className="title">
                                                {t('front.tech')}
                                        </div>
 
                <Helmet>
                        <title>{i18n.t(`${namespace}.heading`)}</title>
                        <meta name="description" content={i18n.t(`${namespace}.description`)} />
+                       <meta property="og:image" content="/media/alttp/tech.png" />
+                       <meta property="twitter:image" content="/media/alttp/tech.png" />
                </Helmet>
                <CanonicalLinks base="/tech" />
                <Overview
 
 
 Route::get('/sitemap.xml', [SitemapXmlController::class, 'index']);
 
+Route::get('/events', 'App\Http\Controllers\EventController@webIndex');
+
 Route::get('/events/{name}', 'App\Http\Controllers\EventController@web');
 
 Route::get('/dungeons/{name}', function ($name) {
        return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'ruleset', 'name' => $name]);
 });
 
+Route::get('/tech', 'App\Http\Controllers\TechniqueController@webIndex');
+
 Route::get('/tech/{name}', function ($name) {
        return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'tech', 'name' => $name]);
 });