use App\Models\Event;
 use Carbon\Carbon;
+use Illuminate\Database\Eloquent\ModelNotFoundException;
 use Illuminate\Http\Request;
 
 class EventController extends Controller
                return $event->toJson();
        }
 
+       public function web(Request $request, string $name) {
+               $event = Event::where('name', '=', $name)->first();
+               if ($event) {
+                       $view = view('app')
+                               ->with('title', $event->getTranslatedTitle())
+                               ->with('description', $event->getTranslatedShort());
+                       if ($event->banner) {
+                               $view = $view->with('image', url($event->banner));
+                       }
+                       return $view;
+               }
+               throw new ModelNotFoundException();
+       }
+
 }
 
                return $this->hasMany(Episode::class);
        }
 
+       public function getTranslatedTitle(): string {
+               if ($this->description) {
+                       return $this->description->getTranslatedProperty('title');
+               }
+               return $this->title;
+       }
+
+       public function getTranslatedShort(): string {
+               if ($this->description) {
+                       return $this->description->getTranslatedProperty('short');
+               }
+               return '';
+       }
+
        protected $casts = [
                'end' => 'datetime',
                'start' => 'datetime',
 
                        </div>
                        <div className="episode-titlebar">
                                {episode.title || episode.event ?
-                                       <div className="episode-title fs-5 fs-md-4">
+                                       <h3 className="episode-title fs-5 fs-md-4">
                                                {episode.title || episode.event.title}
-                                       </div>
+                                       </h3>
                                : null}
                                {episode.comment ?
-                                       <div className="episode-comment">
+                                       <p className="episode-comment">
                                                {episode.comment}
-                                       </div>
+                                       </p>
                                : null}
                        </div>
                        <div className="episode-channel-links ms-auto text-end">
 
                                </Button>
                        : null}
                </div>
+               {event.banner ?
+                       <div className="event-banner-container">
+                               <div className="event-banner" style={{ backgroundImage: `url(${event.banner})` }} />
+                       </div>
+               : null}
                {event.description ?
                        <RawHTML html={getTranslation(event.description, 'description', i18n.language)} />
                : null}
                editContent: PropTypes.func,
        }),
        event: PropTypes.shape({
+               banner: PropTypes.string,
                description: PropTypes.shape({
                }),
                end: PropTypes.string,
 
                                        </> : null}
                                </div>
                        : null}
-                       {event.description?
-                               <div>
-                                       <RawHTML
-                                               html={getTranslation(event.description, 'description', i18n.language)}
-                                       />
-                               </div>
-                       : null}
+                       <div style={{ flexGrow: '1' }}>
+                               {event.banner ?
+                                       <Link to={getLink(event)}>
+                                               <div className="event-banner-container">
+                                                       <div className="event-banner" style={{ backgroundImage: `url(${event.banner})` }} />
+                                               </div>
+                                       </Link>
+                               : null}
+                               {event.description?
+                                               <RawHTML
+                                                       html={getTranslation(event.description, 'description', i18n.language)}
+                                               />
+                               : null}
+                       </div>
                </div>
        </li>;
 };
 
 Item.propTypes = {
        event: PropTypes.shape({
+               banner: PropTypes.string,
                corner: PropTypes.string,
                description: PropTypes.shape({
                }),
 
                                content={getTranslation(event.description, 'short', i18n.language)}
                        />
                </Helmet> : null}
+               {event.banner ? <Helmet>
+                       <meta property="og:image" content={event.banner} />
+                       <meta property="twitter:image" content={event.banner} />
+               </Helmet> : null}
                <CanonicalLinks base={`/events/${event.name}`} />
                <Container>
                        <Detail actions={actions} event={event} />
 
                                </Link>
                        </Col>
                        <Col sm={6}>
-                               <Link className="front-panel" to="/tournaments/6">
+                               <Link className="front-panel" to="/tournaments/7">
                                        <Image alt="" className="image" src="/media/alttp/front.png" />
                                        <div className="title">
                                                {t('front.circus')}
 
 import Filter from '../components/episodes/Filter';
 import List from '../components/episodes/List';
 import RestreamDialog from '../components/episodes/RestreamDialog';
-import { invertEventFilter, toggleEventFilter } from '../helpers/Episode';
+import { invertEventFilter } from '../helpers/Episode';
 import { useUser } from '../hooks/user';
 
 export const Component = () => {
                        setRestreamChannel(null);
                        setRestreamEpisode(null);
                        setShowRestreamDialog(false);
-               } catch (e) {
-                       toastr.error(t('episodes.restreamDialog.removeError'));
+               } catch (error) {
+                       toastr.error(t('episodes.restreamDialog.removeError', { error }));
                }
        }, []);
 
                                ...newChannel,
                        }));
                        toastr.success(t('episodes.restreamDialog.editSuccess'));
-               } catch (e) {
-                       toastr.error(t('episodes.restreamDialog.editError'));
+               } catch (error) {
+                       toastr.error(t('episodes.restreamDialog.editError', { error }));
                }
        }, []);
 
                                ...newChannel,
                        }));
                        toastr.success(t('episodes.restreamDialog.crewSuccess'));
-               } catch (e) {
-                       toastr.error(t('episodes.restreamDialog.crewError'));
+               } catch (error) {
+                       toastr.error(t('episodes.restreamDialog.crewError', { error }));
                }
        }, []);
 
 
        background-size: 6rem auto;
        background-repeat: no-repeat;
        background-position: left bottom;
+       display: flex;
+       flex-direction: column;
        min-height: 8rem;
 
        &.is-active {
        .episode-start {
                width: 4rem;
        }
+       .episode-title {
+               font-weight: normal;
+               line-height: var(--bs-body-line-height);
+       }
+       .episode-comment {
+               margin-bottom: 0;
+       }
        @include media-breakpoint-up(md) {
                .episode-body {
                        margin-left: 5rem;
 
                img {
                        max-height: 3rem;
+                       height: 3rem;
                        width: auto;
                        border-radius: 50%;
                        margin: 0 0.5rem 0 0;
 
        img {
                max-height: 2rem;
+               height: 2rem;
                width: auto;
                border-radius: 50%;
                margin: 0 0.25rem 0 0;
 
                width: 10rem;
        }
 }
+
+.event-banner-container {
+       position: relative;
+       margin-bottom: 1.5em;
+       padding-top: 25%;
+       @include media-breakpoint-up(md) {
+               padding-top: 20%;
+       }
+}
+.event-banner {
+       position: absolute;
+       top: 0;
+       left: 0;
+       width: 100%;
+       height: 100%;
+       background-position: center center;
+       background-size: cover;
+}
 
 
 Route::get('/sitemap.xml', [SitemapXmlController::class, 'index']);
 
-Route::get('/dungeons/{name}', function($name) {
+Route::get('/events/{name}', 'App\Http\Controllers\EventController@web');
+
+Route::get('/dungeons/{name}', function ($name) {
        return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'dungeon', 'name' => $name]);
 });
 
-Route::get('/locations/{name}', function($name) {
+Route::get('/locations/{name}', function ($name) {
        return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'location', 'name' => $name]);
 });
 
-Route::get('/modes/{name}', function($name) {
+Route::get('/modes/{name}', function ($name) {
        return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'mode', 'name' => $name]);
 });
 
-Route::get('/rulesets/{name}', function($name) {
+Route::get('/rulesets/{name}', function ($name) {
        return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'ruleset', 'name' => $name]);
 });
 
-Route::get('/tech/{name}', function($name) {
+Route::get('/tech/{name}', function ($name) {
        return app()->call('App\Http\Controllers\TechniqueController@web', ['type' => 'tech', 'name' => $name]);
 });