update team page
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
name: Andrey
|
name: Andrey Beletsky
|
||||||
role: LBRY.tv Engineer
|
role: Backend Engineer
|
||||||
email: Andrey@lbry.com
|
email: andrey@lbry.com
|
||||||
---
|
---
|
||||||
Andrey got into web programming twenty years ago and has done it all, from Perl CGI programming to UI design. At a turning point decided to focus on server-side applications, making exciting technologies accessible to both fellow developers and users. Easily fascinated by distributed and decentralized things. Values understandable code and can agonize over naming a variable for days. Works mostly when everyone is asleep. When not working, travels around South-East Asia, doing scuba diving wherever there’s water around.
|
Andrey got into web programming twenty years ago and has done it all, from Perl CGI programming to UI design. At a turning point decided to focus on server-side applications, making exciting technologies accessible to both fellow developers and users. Easily fascinated by distributed and decentralized things. Values understandable code and can agonize over naming a variable for days. Works mostly when everyone is asleep. When not working, travels around South-East Asia, doing scuba diving wherever there’s water around.
|
12
content/bio/drew-hancock.md
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
---
|
||||||
|
name: Drew Hancock
|
||||||
|
role: Community Coordinator
|
||||||
|
email: drew@lbry.com
|
||||||
|
twitter: lockoutdays
|
||||||
|
---
|
||||||
|
|
||||||
|
Drew's role is to spread awareness of LBRY and get as many people using it as possible.
|
||||||
|
He's active in the LBRY community, which means he spends a lot of time on social media.
|
||||||
|
He also produces video content for the official LBRY and Odysee channels.
|
||||||
|
|
||||||
|
Drew is from Missouri and is an avid Kansas City Chiefs fan.
|
17
content/bio/johnny-nelson.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
name: Johnny Nelson
|
||||||
|
role: Senior Machine Learning Engineer
|
||||||
|
email: jbn@lbry.com
|
||||||
|
twitter: generativist
|
||||||
|
github: jbn
|
||||||
|
---
|
||||||
|
|
||||||
|
Johnny thinks a lot about how attention works on the internet. Having started programming in elementary
|
||||||
|
school, he became infatuated with how we communicate with and through computers. Eventually, he did
|
||||||
|
a Ph.D. studying belief systems computationally. Immediately afterwards he left academia, intent on
|
||||||
|
putting what he learned into practice.
|
||||||
|
|
||||||
|
Johnny cares about the systems we inhabit -- how they allow us to exchange ideas and find each other.
|
||||||
|
In short, he's motivated by the premise that we can "engineer the noosphere." The internet and
|
||||||
|
everything after is still in early development! Given that he believes censorship-resistance is a
|
||||||
|
long-term evolutionary pressure, it doesn't make sense to work on a platform that doesn't treat it as a given.
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
name: Josh Finer
|
name: Josh Finer
|
||||||
role: Founder, Director of Operations and Analytics
|
role: Founder, Director of Operations & Analytics
|
||||||
email: josh@lbry.com
|
email: josh@lbry.com
|
||||||
twitter: finer9
|
twitter: finer9
|
||||||
github: finer9
|
github: finer9
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
name: Mark Beamer
|
name: Mark Beamer
|
||||||
role: Backend and Database Engineer
|
role: Backend Engineer
|
||||||
email: mark@lbry.com
|
email: mark@lbry.com
|
||||||
github: tiger5226
|
github: tiger5226
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
name: Niko Storni
|
name: Niko Storni
|
||||||
role: DevOps Engineer
|
role: Infrastructure Engineer
|
||||||
email: Niko@lbry.com
|
email: Niko@lbry.com
|
||||||
twitter: Nikooo777
|
twitter: Nikooo777
|
||||||
github: Nikooo777
|
github: Nikooo777
|
||||||
|
|
18
content/bio/roy-lee.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
name: Roy Lee
|
||||||
|
role: Blockchain Engineering Manager
|
||||||
|
email: roylee@lbry.com
|
||||||
|
github: roylee17
|
||||||
|
---
|
||||||
|
|
||||||
|
Roy is an outdoor enthusiast, an avid hiker, who has day hiked a few 14ners, including Mt. Whitney,
|
||||||
|
Langley, Shasta. Recently, he enjoyed his inaugural season of snowboarding at Tahoe, and can’t wait
|
||||||
|
for more seasons to come.
|
||||||
|
|
||||||
|
Professionally, he is passionate about building software as well as teams. The broad interest in
|
||||||
|
software architectures, system design, distributed systems, and product development has led him
|
||||||
|
to the latest endeavor in LBRY.
|
||||||
|
|
||||||
|
Prior to LBRY, he has built and scaled out the Cloud Native Edge Platform at TikTok, which serves
|
||||||
|
huge traffics around the globe. Before that, he also prototyped and led EMV payment products
|
||||||
|
developments in PayPal.
|
8
content/bio/xander-luciano.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
name: Xander Luciano
|
||||||
|
role: Application Engineer
|
||||||
|
email: xander@lbry.com
|
||||||
|
github: DispatchCommit
|
||||||
|
---
|
||||||
|
|
||||||
|
Xander works on the apps and livestreaming.
|
|
@ -131,6 +131,8 @@ class Controller
|
||||||
$router->any('/dmca', 'ReportActions::executeDmca');
|
$router->any('/dmca', 'ReportActions::executeDmca');
|
||||||
$router->any('/dmca/{claimid}', 'ReportActions::executeDmcaWithClaimId');
|
$router->any('/dmca/{claimid}', 'ReportActions::executeDmcaWithClaimId');
|
||||||
|
|
||||||
|
$router->any('/team/{slug}', 'TeamActions::executeBio');
|
||||||
|
|
||||||
$router->any('/youtube/status/{token}', 'AcquisitionActions::executeYoutubeStatus');
|
$router->any('/youtube/status/{token}', 'AcquisitionActions::executeYoutubeStatus');
|
||||||
$router->any('/youtube', 'AcquisitionActions::executeYouTube');
|
$router->any('/youtube', 'AcquisitionActions::executeYouTube');
|
||||||
|
|
||||||
|
|
|
@ -231,34 +231,43 @@ class ContentActions extends Actions
|
||||||
{
|
{
|
||||||
$person = $vars['person'];
|
$person = $vars['person'];
|
||||||
$path = 'bio/' . $person . '.md';
|
$path = 'bio/' . $person . '.md';
|
||||||
list($metadata, $bioHtml) = View::parseMarkdown($path);
|
[$metadata, $bioHtml] = View::parseMarkdown($path);
|
||||||
$imgSrc = 'https://spee.ch/@lbryteam:6/' . $person . '.jpg';
|
|
||||||
return $vars + $metadata + [
|
return $vars + $metadata + [
|
||||||
'imgSrc' => $imgSrc,
|
'imgSrc' => '/img/bio/' . $person . '.jpg',
|
||||||
'bioHtml' => $bioHtml,
|
'bioHtml' => $bioHtml,
|
||||||
'orientation' => 'vertical'
|
];
|
||||||
];
|
}
|
||||||
|
|
||||||
|
public static function prepareBioCirclePartial(array $vars): array
|
||||||
|
{
|
||||||
|
$post = ContentActions::prepareBioPartial(['person' => $vars['slug']]);
|
||||||
|
return [
|
||||||
|
'bioSlug' => $vars['slug'],
|
||||||
|
'imgSrc' => $post['imgSrc'],
|
||||||
|
'name' => $post['name'],
|
||||||
|
'role' => $post['role'],
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function preparePostAuthorPartial(array $vars): array
|
public static function preparePostAuthorPartial(array $vars): array
|
||||||
{
|
{
|
||||||
$post = $vars['post'];
|
$post = $vars['post'];
|
||||||
return [
|
return [
|
||||||
'authorName' => $post->getAuthorName(),
|
'authorName' => $post->getAuthorName(),
|
||||||
'photoImgSrc' => $post->getAuthorPhoto(),
|
'photoImgSrc' => $post->getAuthorPhoto(),
|
||||||
'authorBioHtml' => $post->getAuthorBioHtml(),
|
'authorBioHtml' => $post->getAuthorBioHtml(),
|
||||||
'authorGithub' => $post->getAuthorGithubID(),
|
'authorGithub' => $post->getAuthorGithubID(),
|
||||||
'authorTwitter' => $post->getAuthorTwitterID(),
|
'authorTwitter' => $post->getAuthorTwitterID(),
|
||||||
'authorEmail' => $post->getAuthorPostEmail()
|
'authorEmail' => $post->getAuthorPostEmail()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function preparePostListPartial(array $vars): array
|
public static function preparePostListPartial(array $vars): array
|
||||||
{
|
{
|
||||||
$count = $vars['count'] ?? 3;
|
$count = $vars['count'] ?? 3;
|
||||||
return [
|
return [
|
||||||
'posts' => array_slice(Post::find(static::VIEW_FOLDER_NEWS, Post::SORT_DATE_DESC), 0, $count)
|
'posts' => array_slice(Post::find(static::VIEW_FOLDER_NEWS, Post::SORT_DATE_DESC), 0, $count)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
public static function executePostCategoryFilter(string $category)
|
public static function executePostCategoryFilter(string $category)
|
||||||
{
|
{
|
||||||
|
@ -269,29 +278,29 @@ class ContentActions extends Actions
|
||||||
$posts = array_filter(
|
$posts = array_filter(
|
||||||
Post::find(static::VIEW_FOLDER_NEWS, Post::SORT_DATE_DESC),
|
Post::find(static::VIEW_FOLDER_NEWS, Post::SORT_DATE_DESC),
|
||||||
function (Post $post) use ($category) {
|
function (Post $post) use ($category) {
|
||||||
return (($post->getCategory() === $category) && (!$post->getDate() || $post->getDate()->format('U') <= date('U')));
|
return (($post->getCategory() === $category) && (!$post->getDate() || $post->getDate()->format('U') <= date('U')));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return ['content/news', [
|
return ['content/news', [
|
||||||
'posts' => $posts,
|
'posts' => $posts,
|
||||||
View::LAYOUT_PARAMS => [
|
View::LAYOUT_PARAMS => [
|
||||||
'showRssLink' => true
|
'showRssLink' => true
|
||||||
]
|
]
|
||||||
]];
|
]];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function prepareJobsPartial(array $vars)
|
public static function prepareJobsPartial(array $vars)
|
||||||
{
|
{
|
||||||
$jobs =
|
$jobs =
|
||||||
array_filter(
|
array_filter(
|
||||||
array_map('View::parseMarkdown', glob(static::VIEW_FOLDER_JOBS . '/*')),
|
array_map('View::parseMarkdown', glob(static::VIEW_FOLDER_JOBS . '/*')),
|
||||||
function ($job) {
|
function ($job) {
|
||||||
return $job[0]['status'] !== 'closed';
|
return $job[0]['status'] !== 'closed';
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
usort($jobs, function ($jobA, $jobB) {
|
usort($jobs, function ($jobA, $jobB) {
|
||||||
if ($jobA[0]['status'] === 'active' xor $jobB[0]['status'] === 'active') {
|
if ($jobA[0]['status'] === 'active' xor $jobB[0]['status'] === 'active') {
|
||||||
|
|
16
controller/action/TeamActions.class.php
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class TeamActions extends Actions
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* A team member's page
|
||||||
|
*
|
||||||
|
* @param string $slug
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function executeBio(string $slug)
|
||||||
|
{
|
||||||
|
return ['content/bio', ['slug' => $slug]];
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,6 +33,10 @@
|
||||||
</figure>
|
</figure>
|
||||||
|
|
||||||
<div class="bio">
|
<div class="bio">
|
||||||
|
<?php if ($showName ?? false) :?>
|
||||||
|
<h3><?php echo $name ?></h3>
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
<?php echo $bioHtml ?>
|
<?php echo $bioHtml ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
7
view/template/content/_bioCircle.php
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<div class="bio-circle">
|
||||||
|
<a href="/team/<?php echo $bioSlug ?>">
|
||||||
|
<img src="<?php echo $imgSrc ?>" />
|
||||||
|
</a>
|
||||||
|
<?php echo $name ?><br/>
|
||||||
|
<small><?php echo $role ?></small>
|
||||||
|
</div>
|
16
view/template/content/bio.php
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?php NavActions::setNavUri('/learn') ?>
|
||||||
|
<?php Response::addMetaImage('https://spee.ch/@lbryteam/everyone-banner2.jpg') ?>
|
||||||
|
<?php Response::setMetaDescription('description.team') ?>
|
||||||
|
|
||||||
|
<main class="ancillary">
|
||||||
|
<section class="hero hero--half-height" style="background-image: url(https://spee.ch/3cb82a81e95c147686dbf90e9983640939461c53/everyone-banner3.jpg)">
|
||||||
|
<div class="inner-wrap inner-wrap--center-hero">
|
||||||
|
<h1>The Team</h1>
|
||||||
|
<h2>Teamwork makes the dream work</h2>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<?php echo View::render('content/_bio', ['person' => $slug, 'showName' => true]) ?>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
|
@ -5,49 +5,31 @@
|
||||||
<main class="ancillary">
|
<main class="ancillary">
|
||||||
<section class="hero" style="background-image: url(https://spee.ch/3cb82a81e95c147686dbf90e9983640939461c53/everyone-banner3.jpg)">
|
<section class="hero" style="background-image: url(https://spee.ch/3cb82a81e95c147686dbf90e9983640939461c53/everyone-banner3.jpg)">
|
||||||
<div class="inner-wrap inner-wrap--center-hero">
|
<div class="inner-wrap inner-wrap--center-hero">
|
||||||
<h1>{{page.team.header}}</h1>
|
<h1>The Team</h1>
|
||||||
<h2>Teamwork makes the dream work.</h2>
|
<h2>Teamwork makes the dream work</h2>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<?php $teams = [
|
||||||
<div class="inner-wrap">
|
"Leadership" => ['jeremy-kauffman', 'alex-grintsvayg'],
|
||||||
<h2>Leadership</h2>
|
"Technical" => ['lex-berezhny', 'brannon-king', 'jack-robison', 'akinwale-ariwodola',
|
||||||
</div>
|
'andrey-beletsky', 'niko-storni', 'mark-beamer', 'roy-lee', 'johnny-nelson'],
|
||||||
|
"Growth" => ['julian-chandra', 'drew-hancock'],
|
||||||
|
"Business" => ['josh-finer', 'tom-zarebczan'],
|
||||||
|
"Advisory Team" => ['alex-tabarrok', 'ray-carballada', 'stephan-kinsella', 'michael-huemer'],
|
||||||
|
] ?>
|
||||||
|
|
||||||
<?php foreach (['jeremy-kauffman', 'alex-grintsvayg'] as $bioSlug): ?>
|
<?php foreach ($teams as $team => $members): ?>
|
||||||
<?php echo View::render('content/_bio', ['person' => $bioSlug]) ?>
|
<section>
|
||||||
<?php endforeach ?>
|
<div class="inner-wrap">
|
||||||
</section>
|
<h2><?php echo $team ?></h2>
|
||||||
|
</div>
|
||||||
<section>
|
<div class="inner-wrap team-members">
|
||||||
<div class="inner-wrap">
|
<?php foreach ($members as $bioSlug): ?>
|
||||||
<h2>Technical</h2>
|
<?php echo View::render('content/_bioCircle', ['slug' => $bioSlug]) ?>
|
||||||
</div>
|
<?php endforeach ?>
|
||||||
|
</div>
|
||||||
<?php foreach (['lex-berezhny', 'brannon-king', 'jack-robison', 'akinwale-ariwodola', 'antoniyshumanov', 'andrey', 'sean-yesmunt', 'niko-storni', 'mark-beamer'] as $bioSlug): ?>
|
</section>
|
||||||
<?php echo View::render('content/_bio', ['person' => $bioSlug]) ?>
|
<?php endforeach ?>
|
||||||
<?php endforeach ?>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section>
|
|
||||||
<div class="inner-wrap">
|
|
||||||
<h2>Business</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?php foreach (['josh-finer', 'julian-chandra', 'tom-zarebczan', 'julie-sigwart'] as $bioSlug): ?>
|
|
||||||
<?php echo View::render('content/_bio', ['person' => $bioSlug]) ?>
|
|
||||||
<?php endforeach ?>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section>
|
|
||||||
<div class="inner-wrap">
|
|
||||||
<h2>{{page.team.advisory}}</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?php foreach (['alex-tabarrok', 'ray-carballada', 'stephan-kinsella', 'michael-huemer'] as $bioSlug): ?>
|
|
||||||
<?php echo View::render('content/_bio', ['person' => $bioSlug]) ?>
|
|
||||||
<?php endforeach ?>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
BIN
web/img/bio/akinwale-ariwodola.jpg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
web/img/bio/alex-grintsvayg.jpg
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
web/img/bio/alex-tabarrok.jpg
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
web/img/bio/andrey-beletsky.jpg
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
web/img/bio/brannon-king.jpg
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
web/img/bio/brinck-slattery.jpg
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
web/img/bio/drew-hancock.jpg
Normal file
After Width: | Height: | Size: 280 KiB |
BIN
web/img/bio/jack-robison.jpg
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
web/img/bio/jeremy-kauffman.jpg
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
web/img/bio/johnny-nelson.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
web/img/bio/josh-finer.jpg
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
web/img/bio/julian-chandra.jpg
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
web/img/bio/julie-sigwart.jpg
Normal file
After Width: | Height: | Size: 303 KiB |
BIN
web/img/bio/kay-kurokawa.jpg
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
web/img/bio/lex-berezhny.jpg
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
web/img/bio/mark-beamer.jpg
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
web/img/bio/michael-huemer.jpg
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
web/img/bio/niko-storni.jpg
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
web/img/bio/ray-carballada.jpg
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
web/img/bio/rob-smith.jpg
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
web/img/bio/roy-lee.jpg
Normal file
After Width: | Height: | Size: 415 KiB |
BIN
web/img/bio/samuel-lbryian.jpg
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
web/img/bio/sean-yesmunt.jpg
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
web/img/bio/stephan-kinsella.jpg
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
web/img/bio/tom-zarebczan.jpg
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
web/img/bio/xander-luciano.jpg
Normal file
After Width: | Height: | Size: 52 KiB |
|
@ -16,3 +16,42 @@
|
||||||
background-color: rgba($lbry-teal-1, 0.3);
|
background-color: rgba($lbry-teal-1, 0.3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//https://www.webfx.com/blog/web-design/circular-images-css/
|
||||||
|
.team-members {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
|
||||||
|
.bio-circle {
|
||||||
|
margin: 1.5rem 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bio-circle {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
overflow: hidden;
|
||||||
|
border-radius: 50%;
|
||||||
|
//filter: grayscale(100%);
|
||||||
|
//&:hover {
|
||||||
|
// filter: none;
|
||||||
|
//}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
max-width: 250px;
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
max-height: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|