Repository: resume/resume.github.com Branch: master Commit: f5990756495b Files: 16 Total size: 41.7 KB Directory structure: gitextract_i1i20v1x/ ├── README.markdown ├── config.ru ├── css/ │ ├── print.css │ └── resume.css ├── index.html ├── js/ │ └── githubresume.js └── views/ ├── api_limit.html ├── contrib.html ├── error.html ├── index.html ├── job.html ├── not_found.html ├── opt_out.html ├── org.html ├── resume.html └── resumeOrgs.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: README.markdown ================================================ # [GitHub Résumé](https://resume.github.io/) **A service that creates a résumé based on your GitHub repos/activity.** GitHub Résumé is **opt-in**. To make your resume visible, just **star** [this project](https://github.com/resume/resume.github.com). To view your résumé, go to `https://resume.github.io/?yourusername` or follow the instructions on the [home page](https://resume.github.io/). Great for all the tech-savy bosses who want to have a **quick view** of person's git/github activity, _before the interview_. ### Development To run the app in development mode: $ rackup config.ru (You must have Ruby and the rack gem installed.) ================================================ FILE: config.ru ================================================ use Rack::Static, :urls => ["/css", "/images", "/js", "/views"], :root => "." run lambda { |env| [200, { 'Content-Type' => 'text/html' }, File.open('index.html', File::RDONLY)] } ================================================ FILE: css/print.css ================================================ /* Print stylesheet for résumés */ /* =! Template */ #doc2 { width: 100%; } #inner { margin: 0 auto; padding: 10pt; border: 0; } header { margin-top: 0; } .enlarge { padding-right: 0; } .talent li { border: 0; } .org p, .job p { margin: 5pt 0 15pt; } #repositories { padding-bottom: 0; } #jobs h4 { margin-top: 10pt; } #jobs .job, #about { page-break-inside: avoid; } article, #about { margin-bottom: 0; } footer { padding: 5pt 0; } /* --------- */ /* =! Font */ body { font-size: 10pt; } header h1 { font-size: 28pt; } header h2 { font-size: 14pt; } article h2, #profile .enlarge, #about .enlarge { font-size: 12pt; } /* --------- */ /* =! Colors */ body, h1, h2, h3, h4 { color: #000; } #inner { background: #fff; } /* --------- */ /* =! Links */ #profile a:after, #repositories a:after, #about a:after { content: " (" attr(href) ")"; font-style: italic; font-size: 10pt; } #profile #myblog:after, #jobs p a:after { content: none; } a { text-decoration: none; } #mylanguages a, #jobs p a { color: inherit; } #actions { visibility: hidden; } /* --------- */ ================================================ FILE: css/resume.css ================================================ /* --------------------------------------------------------------------------------- STRIPPED DOWN RESUME TEMPLATE html resume v0.9: 5/28/09 design and code by: thingsthatarebrown.com (matt brown) --------------------------------------------------------------------------------- */ .msg { padding: 10px; background: #222; position: relative; } .msg h1 { color: #fff } .msg a { margin-left: 20px; background: #408814; color: white; padding: 4px 8px; text-decoration: none; } .msg a:hover { background: #266400 } html { height: 100% ! important; background: url('../images/low_contrast_linen.png'); } /* //-- yui-grids style overrides -- */ body { font-family: Georgia, Garamond, "Times New Roman", Times, serif; color: #444; } .yui-gf { margin-bottom: 2em; padding-bottom: 2em; border-bottom: 1px solid #ccc; } .yui-gf div.first { width: 12.3% } .yui-gf .yui-u { width: 80.2% } /* //-- header, body, footer -- */ header { margin: 2.5em 0 3em 0; padding-bottom: 1.5em; border-bottom: 1px solid #ccc; } header h1 { font-size: 48px; text-transform: uppercase; letter-spacing: 3px; } header h2 { text-transform: uppercase; letter-spacing: 2px; } article, footer { margin-bottom: 2em } footer p { margin-bottom: 0; text-align: center; } /* //-- footer -- */ footer { padding: 1em 0 5em 0; font-size: 92%; border-top: 1px solid #ccc; text-align: center; } /* //-- core typography and style -- */ h2 { font-size: 152% } h3, h4 { font-size: 122% } h1, h2, h3, h4 { color: #333 } p { font-size: 100%; line-height: 18px; } a { color: #990003 } a:hover { text-decoration: none } strong { font-weight: bold } li { line-height: 24px; border-bottom: 1px solid #ccc; } p.enlarge { font-size: 144%; line-height: 24px; } .contact-info { margin-top: 7px; text-align: right; font-size: 12px; position: relative; float: left; width: 100%; } .contact-info img { float: right; border: 1px solid #ccc; width: 140px; height: 140px; margin: -24px 0 14px; border-radius: 3px; } .contact-info a { position : relative; float: left; width: 100%; } .first h2 { font-style: italic } .last { border-bottom: 0 } /* //-- section styles -- */ #pdf { display: block; float: left; background: #666; color: #fff; padding: 6px 50px 6px 12px; margin-bottom: 6px; text-decoration: none; } #pdf:hover { background: #222 } .org, .job { position: relative; margin-bottom: 1em; padding-bottom: 1em; border-bottom: 1px solid #ccc; } .org h3, .job h3 { font-size: 100%; } .org h4, .job h4 { position: absolute; top: 0.35em; right: 0; } .org a, .job a { border: none; text-decoration: none; } .org p, .job p { margin: 0.75em 0 3em 0; font-size: 122%; } .last { border: none } .talent { width: 32%; float: left; } .talent h2 { margin-bottom: 6px } #srt-ttab { margin-bottom: 100px; text-align: center; } #srt-ttab img.last { margin-top: 20px } /* --// override to force 1/8th width grids -- */ #username { position: relative; float: left; height: 30px; width: 75%; border: 2px solid #444; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; font-family: Georgia, Garamond, "Times New Roman", Times, serif; color: #444; font-size: 18px; padding: 5px; } #gen { position: relative; float: left; margin-left: 10px; width: 20%; height: 44px; font-family: Georgia, Garamond, "Times New Roman", Times, serif; font-size: 18px; color: #fff; background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0.21, rgb(31,31,31)), color-stop(0.61, rgb(51,51,51)) ); background-image: -moz-linear-gradient( center bottom, rgb(31,31,31) 21%, rgb(51,51,51) 61% ); border: 1px solid #444; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } #gen:hover { cursor: pointer } .yui-gb { margin-top: 10px; margin-bottom: 10px; padding-bottom: 10px; } .enlarge-medium { font-size: 15px } .yui-gb ul { width: 80% } noscript { display: block; margin-top: 30px; font-size: 152%; color: #990003; } #actions { padding: 30px 0 40px 0; margin: 0 auto 0 auto; width: 73.076em; } #actions a { color: #ccc; text-decoration: none; text-shadow: 0 0 5px #000; margin-left: 1em; } #actions * { float: right } #doc { margin-top: 70px; background: #f5f5f5; padding: 25px 107px 0px 107px; } #doc2 { padding-bottom: 70px } .contributions { padding-bottom: 10px; } @media screen and (max-width: 59.9em) { #inner { padding: 5 5 5 5; margin: 0 auto; background: #f5f5f5; border: solid #666; border-width: 8px 0 2px 0; box-shadow: 0 1px 3px #000; } header h1 { font-size: 2.2em; font-weight: bold; text-transform: uppercase; letter-spacing: 0.2em; } header h2 { font-size: 1.5em; text-transform: uppercase; letter-spacing: 0.2em; } #doc2 { width: 100%; padding-bottom: 1em; } #actions{ display: none; } h1{ font-size: 2em; } h2{ font-size: 1.5em; } p.enlarge { font-size: 1.4em; line-height: 1.2em; } li { line-height: 1.6em; } h3, h4{ font-size: 1.3em; } p{ font-size: 1.2em; line-height: 1.1em; } .org p, .job p { margin: 0.75em 0 1.5em 0; } .first h2, .first h1{ padding-left: 0.5em; } .yui-gf div.first { width: 20%; } .yui-gf .yui-u { width: 80% } } @media screen and (min-width: 60em) { #inner { padding: 10px 80px; margin: 0 auto; background: #f5f5f5; border: solid #666; border-width: 8px 0 2px 0; box-shadow: 0 1px 3px #000; } } ================================================ FILE: index.html ================================================ GitHub Résumé ================================================ FILE: js/githubresume.js ================================================ var urlParams = {}; var username; var trackerId = 'UA-21222559-1'; (function () { var e, a = /\+/g, // Regex for replacing addition symbol with a space r = /([^&=]+)=?([^&]*)/g, d = function (s) { return decodeURIComponent(s.replace(a, " ")); }, q = window.location.search.substring(1); while (e = r.exec(q)) { urlParams[0] = d(e[1]); } })(); $(document).ready(function() { try { if (urlParams[0] !== undefined) { username = urlParams[0]; run(); } else { home(); } } catch (err) { try { console.log(err); } catch (e) { /*fail silently*/ } } }); var error = function() { $.ajax({ url: 'views/error.html', dataType: 'html', success: function(data) { var template = data; $('#resume').html(data); } }); }; var home = function() { $.ajax({ url: 'views/index.html', dataType: 'html', success: function(data) { var template = data; $('#resume').html(data); } }); }; var github_user = function(username, callback) { $.getJSON('https://api.github.com/users/' + username + '?callback=?', callback); } var github_user_repos = function(username, callback, page_number, prev_data) { var page = (page_number ? page_number : 1), url = 'https://api.github.com/users/' + username + '/repos?per_page=100&callback=?', data = (prev_data ? prev_data : []); if (page_number > 1) { url += '&page=' + page_number; } $.getJSON(url, function(repos) { data = data.concat(repos.data); if (repos.data.length == 100) { github_user_repos(username, callback, page + 1, data); } else { callback(data); } }); } var github_user_issues = function(username, callback, page_number, prev_data) { var page = (page_number ? page_number : 1), url = 'https://api.github.com/search/issues?q=type:pr+is:merged+author:' + username + '&per_page=100&callback=?' data = (prev_data ? prev_data : []); if (page_number > 1) { url += '&page=' + page_number; } $.getJSON(url, function(repos) { data = data.concat(repos.data.items); if (repos.data.total_count == 100) { github_user_issues(username, callback, page + 1, data); } else { callback(data); } }); } var github_user_orgs = function(username, callback) { $.getJSON('https://api.github.com/users/' + username + '/orgs?callback=?', callback); } // Check to see if the user has starred the resume.github.com repo. // // Returns true/false. var github_user_starred_resume = function(username, page) { var star = false; var repos = []; var page = (page ? page : 1); var url = 'https://api.github.com/users/' + username + '/starred?per_page=100&page=' + page; var errorMsg; $.ajax({ url: url, async: false, dataType: 'json', success: function(data) { repos = data; }, error: function(e) { if (e.status == 403) { errorMsg = 'api_limit' } else if (e.status == 404) { errorMsg = 'not_found' } } }); if (errorMsg === 'api_limit' || errorMsg === 'not_found') { return errorMsg; } $.each(repos, function(i, repo) { if (repo.full_name == "resume/resume.github.com") { star = true; return false; // stop iterating } }); if (star) { return star; } if (repos.length == 100) { star = github_user_starred_resume(username, page + 1); } return star; } var run = function() { var itemCount = 0, maxItems = 5, maxLanguages = 9, starred = github_user_starred_resume(username); if (!starred || starred === 'api_limit' || starred === 'not_found') { if (starred === 'api_limit') { $.ajax({ url: 'views/api_limit.html', dataType: 'html', success: function(data) { var template = data; $('#resume').html(data); } }); } else if (starred === 'not_found') { $.ajax({ url: 'views/not_found.html', dataType: 'html', success: function(data) { var template = data; $('#resume').html(data); } }); } else { $.ajax({ url: 'views/opt_out.html', dataType: 'html', success: function(data) { var template = data; $('#resume').html(data); } }); } return; } var res = github_user(username, function(data) { data = data.data; var sinceDate = new Date(data.created_at); var sinceMonth = sinceDate.getMonth(); var since = sinceDate.getFullYear(); var sinceMonth = sinceDate.getMonth(); var currentYear = (new Date).getFullYear(); switch (since) { case currentYear-1: since = 'last year'; break; case currentYear: since = 'this year'; break; } var addHttp = ''; if (data.blog && data.blog.indexOf('http') < 0) { addHttp = 'http://'; } // set view.name to the "friendly" name e.g. "John Doe". If not defined // (in which case data.name is empty), fall back to the login // name e.g. "johndoe" var name = username; if (data.name !== null && data.name !== undefined && data.name.length) { name = data.name; } var avatar = ''; if (data.type == 'Organization'){ avatar = data.avatar_url.match(/https:\/\/secure.gravatar.com\/avatar\/[0-9a-z]+/)[0]; avatar += '?s=140&d=https://github.com/images/gravatars/gravatar-140.png'; } var view = { name: name, type: data.type, email: data.email, created_at: data.created_at, earlyAdopter: 0, location: data.location, gravatar_id: data.gravatar_id, avatar_url: avatar, repos: data.public_repos, reposLabel: data.public_repos > 1 ? 'repositories' : 'repository', followers: data.followers, followersLabel: data.followers > 1 ? 'followers' : 'follower', username: username, userStatus: 'GitHub user', since: since, resume_url: window.location }; // We consider a limit of 4 months since the GitHub opening (Feb 2008) to be considered as an early adopter if ((since == '2008' && sinceMonth <= 5) || since <= '2007') { view.earlyAdopter = 1; } view.userStatus = getUserStatus(); function getUserStatus() { var COEF_REPOS = 2; var COEF_GISTS = 0.25; var COEF_FOLLOWERS = 0.5; var COEF_FOLLOWING = 0.25; var FIRST_STEP = 0; var SECOND_STEP = 5; var THIRD_STEP = 20; var FOURTH_STEP = 50; var FIFTH_STEP = 150; var EXTRA_POINT_GAIN = 1; var statusScore = data.public_repos * COEF_REPOS + data.public_gists * COEF_GISTS + data.followers * COEF_FOLLOWERS + data.following * COEF_FOLLOWING; // Extra points // - Early adopter if (view.earlyAdopter == 1) { statusScore += EXTRA_POINT_GAIN; } // - Blog & Email & Location if (view.location && view.location != '' && view.email && view.email != '' && data.blog && data.blog != '') { statusScore += EXTRA_POINT_GAIN; } if (statusScore == FIRST_STEP) { return 'Inactive GitHub user'; } else if (statusScore > FIRST_STEP && statusScore <= SECOND_STEP) { return 'Newbie GitHub user'; } else if (statusScore > SECOND_STEP && statusScore <= THIRD_STEP) { return 'Regular GitHub user'; } else if (statusScore > THIRD_STEP && statusScore <= FOURTH_STEP) { return 'Advanced GitHub user'; } else if (statusScore > FOURTH_STEP && statusScore <= FIFTH_STEP) { return 'Enthusiastic GitHub user'; } else if (statusScore > FIFTH_STEP) { return 'Passionate GitHub user'; } }; if (data.blog !== undefined && data.blog !== null && data.blog !== '') { view.website = addHttp + data.blog; } var resume = (data.type == 'User' ? 'views/resume.html' : 'views/resumeOrgs.html'); $.ajax({ url: resume, dataType: 'html', success: function(data) { var template = data, html = Mustache.to_html(template, view); $('#resume').html(html); document.title = name + "'s Résumé"; $("#actions #print").click(function(){ window.print(); return false; }); } }); }); github_user_repos(username, function(data) { var sorted = [], languages = {}, popularity; $.each(data, function(i, repo) { if (repo.fork !== false) { return; } if (repo.language) { if (repo.language in languages) { languages[repo.language]++; } else { languages[repo.language] = 1; } } popularity = repo.watchers + repo.forks; sorted.push({position: i, popularity: popularity, info: repo}); }); function sortByPopularity(a, b) { return b.popularity - a.popularity; }; sorted.sort(sortByPopularity); var languageTotal = 0; function sortLanguages(languages, limit) { var sorted_languages = []; for (var lang in languages) { if (typeof(lang) !== "string") { continue; } sorted_languages.push({ name: lang, popularity: languages[lang], toString: function() { return '' + this.name + ''; } }); languageTotal += languages[lang]; } if (limit) { sorted_languages = sorted_languages.slice(0, limit); } return sorted_languages.sort(sortByPopularity); } $.ajax({ url: 'views/job.html', dataType: 'html', success: function(response) { languages = sortLanguages(languages, maxLanguages); if (languages && languages.length > 0) { var ul = $(''), percent, li; $.each(languages, function(i, lang) { x = i + 1; percent = parseInt((lang.popularity / languageTotal) * 100); li = $('
  • ' + lang.toString() + ' ('+percent+'%)
  • '); if (x % 3 == 0 || (languages.length < 3 && i == languages.length - 1)) { li.attr('class', 'last'); ul.append(li); $('#content-languages').append(ul); ul = $(''); } else { ul.append(li); $('#content-languages').append(ul); } }); } else { $('#mylanguages').hide(); } if (sorted.length > 0) { $('#jobs').html(''); itemCount = 0; var since, until, date, view, template, html; $.each(sorted, function(index, repo) { if (itemCount >= maxItems) { return; } since = new Date(repo.info.created_at); since = since.getFullYear(); until = new Date(repo.info.pushed_at); until = until.getFullYear(); if (since == until) { date = since; } else { date = since + ' – ' + until; } var emojiPattern = /:([a-z0-9_\+\-]+):/g; // no, it's not really a pattern var imagePattern = ""; var description = repo.info.description; repo.info.description = description ? description.replace(emojiPattern, imagePattern) : description; view = { name: repo.info.name, date: date, language: repo.info.language, description: repo.info.description, homepage: repo.info.homepage, username: username, watchers: repo.info.watchers, forks: repo.info.forks, watchersLabel: repo.info.watchers == 0 || repo.info.watchers > 1 ? 'stars' : 'star', forksLabel: repo.info.forks == 0 || repo.info.forks > 1 ? 'forks' : 'fork', }; if (itemCount == sorted.length - 1 || itemCount == maxItems - 1) { view.last = 'last'; } template = response; html = Mustache.to_html(template, view); $('#jobs').append($(html)); ++itemCount; }); } else { if(data.length > 0){ $('#jobs').html('').append('

    All of this user\'s repositories seem to be forks. Sorry.

    '); } else { $('#jobs').html('').append('

    Unfortunately, this user does not seem to have any public repositories.

    '); } } } }); }); github_user_issues(username, function(data) { var sorted = [], repos = {}; $.each(data, function(i, issue) { if(repos[issue.repository_url] === undefined) { repos[issue.repository_url] = { popularity: 1 } } else { repos[issue.repository_url].popularity += 1; } }); $.each(repos, function(repo, obj) { sorted.push({ repo: repo, popularity: obj.popularity}); }) function sortByPopularity(a, b) { return b.popularity - a.popularity; }; sorted.sort(sortByPopularity); $.ajax({ url: 'views/contrib.html', dataType: 'html', success: function(response) { if (sorted.length > 0) { $('#contrib-jobs').html(''); var view, template, html, repoUrl, repoName, commitsUrl; $.each(sorted, function(index, repo) { repoUrl = repo.repo.replace(/https:\/\/api\.github\.com\/repos/, 'https://github.com'); repoName = repo.repo.replace(/https:\/\/api\.github\.com\/repos\//, ''); commitsUrl = repoUrl + '/commits?author=' + username; view = { count: repo.popularity, username: username, repoUrl: repoUrl, repoName: repoName, commitsUrl: commitsUrl }; template = response; html = Mustache.to_html(template, view); $('#contrib-jobs').append($(html)); }); } else { $('#contributions').remove(); } } }); }); github_user_orgs(username, function(response) { var sorted = []; $.each(response.data, function(i, org) { if (org.login === undefined) { return; } sorted.push({position: i, info: org}); }); $.ajax({ url: 'views/org.html', dataType: 'html', success: function(response) { var now = new Date().getFullYear(); if (sorted.length > 0) { $('#orgs').html(''); var name, view, template, html; $.each(sorted, function(index, org) { if (itemCount >= maxItems) { return; } name = (org.info.name || org.info.login); view = { name: name, now: now }; if (itemCount == sorted.length - 1 || itemCount == maxItems) { view.last = 'last'; } template = response; html = Mustache.to_html(template, view); $('#orgs').append($(html)); ++itemCount; }); } else { $('#organizations').remove(); } } }); }); }; if (trackerId) { var _gaq = _gaq || []; _gaq.push(['_setAccount', trackerId]); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); } $(window).bind('error', error); ================================================ FILE: views/api_limit.html ================================================

    API Limit Reached

    The API rate limit has been exceeded for your IP address. Please try again later.

    ================================================ FILE: views/contrib.html ================================================

    {{repoName}}

    {{username}} has contributed for {{repoName}} with {{count}} commit(s)

    ================================================ FILE: views/error.html ================================================

    Uh oh :(

    There was an issue accessing the requested profile to auto-generate this résumé. Access the user's profile directly.

    ================================================ FILE: views/index.html ================================================

    My GitHub Résumé

    As a software startup owner I really enjoy when people send us their résumés and they include their github account so we can see tangible work they have done.


    After a tweet by John Resig I imagined that it may be nice for people to be able to generate their GitHub résumés.





    See some popular users




    Notes, Information and Future features


    This is the first version. I am planning on adding things as such as your most committed forks, most committed repositories and make the "My Popular Repositories" be built from your complete list of repositories. Feel free to fork the page if you want to help :-)

    ================================================ FILE: views/job.html ================================================

    {{name}}

    {{#language}}{{language}} – {{/language}}Creator & Owner

    {{date}}

    {{{description}}} {{#homepage}}{{homepage}}{{/homepage}}

    This repository has {{watchers}} {{watchersLabel}} and {{forks}} {{forksLabel}}. If you would like more information about this repository and my contributed code, please visit the repo on GitHub.

    ================================================ FILE: views/not_found.html ================================================

    User Not Found

    The user you requested was not found. Please check your spelling and try again.

    ================================================ FILE: views/opt_out.html ================================================

    This user hasn't opted in

    This user has not opted in to this unofficial GitHub résumé service.


    If you would like to opt-in, simply go to our GitHub Project page and star the project.

    ================================================ FILE: views/org.html ================================================

    {{name}}

    Member

    {{now}}

    If you would like more information about this organization, please visit the organization page on GitHub.

    ================================================ FILE: views/resume.html ================================================
    Print Email

    {{name}}

    {{userStatus}}

    {{#gravatar_id}} avatar {{/gravatar_id}} {{#email}}

    {{/email}}

    GitHub Profile

    On GitHub {{#earlyAdopter}}as an early adopter {{/earlyAdopter}} since {{since}}, {{name}} is a developer {{#location}} based in {{location}} {{/location}} {{#repos}}with {{repos}} public {{reposLabel}}{{/repos}}{{^repos}}without any public repository for now{{/repos}}{{#followers}} and {{followers}} {{followersLabel}}{{/followers}}.

    {{#website}}

    Website

    {{/website}}

    Languages

    Popular Repositories

    Loading information...

    Contributions

    Loading information...

    Organizations

    Loading information...

    About This Résumé

    This résumé is generated automatically using public information from the developer's GitHub account. The repositories are ordered by popularity based on a very simple popularity heuristic that defines the popularity of a repository by its sum of watchers and forks. Do not hesitate to visit {{name}}'s GitHub page for a complete work history.

    ================================================ FILE: views/resumeOrgs.html ================================================

    {{name}}

    Github organization

    {{#gravatar_id}} avatar {{/gravatar_id}} {{#email}}

    {{email}}

    {{/email}}

    Github Profile

    We are a group of developers {{#location}} based in {{location}} {{/location}} {{#repos}} with {{repos}} public {{reposLabel}} {{/repos}} {{#followers}} and {{followers}} {{followersLabel}}{{/followers}}. We created this GitHub group in {{since}}{{#earlyAdopter}}, therefore we're early adopters,{{/earlyAdopter}}{{#website}} and you can find more information about us at {{website}}{{/website}}.

    Languages

    Our Popular Repositories

    Loading information...

    About This Résumé

    This résumé is generated automatically using information from github. The repositories are ordered by popularity based on a very simple popularity heuristic that defines the popularity of a repository by its sum of watchers and forks. Do not hesitate to visit our github group's page for more information about our repositories and work.