Skip to content

Repository files navigation

Resources Site Template

Setup for Local Development

  1. Clone the repository
  2. Copy the .env.example file to .env
  3. In the .env file add your database credentials and set BRAND_ORG_NAME. See config/branding.php for the full list of branding options including colours, logo, and images.
  4. Create the local MySQL database if needed (e.g. mysql -u root -e "CREATE DATABASE resources_site_template;")
  5. Run composer install to install PHP dependencies
  6. Run npm install to install JavaScript dependencies
  7. Run php artisan key:generate to set the application key
  8. Run php artisan migrate --seed to set up the database with tables and seed
  9. Run npm run dev to set Vite running, which reloads assets on changes
  10. If you're using Laravel Valet or Herd, go to http://resources-site-template.test in your browser. Otherwise, run php artisan serve and go to the provided URL.

If you've run the seeders, you can log in with test@example.com and password 'password'.

To seed example troves, collections, and tags for local development, run the example data seeder separately after the main seed:

php artisan db:seed --class="Database\Seeders\Example\ExampleDataSeeder"

File Storage (AWS S3)

The app uses AWS S3 for file storage. Set up an S3 bucket and add your credentials to .env — see .env.example for the required AWS_* variables. It's recommended to use S3 locally too so your setup matches production.

If you don't have S3 set up, you can use the local public disk for development by setting FILESYSTEM_DISK=local and MEDIA_DISK=public in your .env, then running php artisan storage:link. Note that files won't persist in the same way as S3.

Meilisearch

Search is powered by Meilisearch. The SCOUT_DRIVER config defaults to null (search disabled, no external service required), so search only works once you explicitly set SCOUT_DRIVER=meilisearch in your .env and have Meilisearch running. To keep search disabled locally, either leave SCOUT_DRIVER unset or set it to null.

To run Meilisearch locally:

  1. Install Meilisearch - instructions here.
  2. Run meilisearch --master-key="aSampleMasterKey" - keep this running in a separate terminal window.
  3. In your .env, uncomment/set SCOUT_DRIVER=meilisearch and check MEILISEARCH_HOST/MEILISEARCH_KEY match the instance above (MEILISEARCH_KEY must match the --master-key you started Meilisearch with).
  4. SCOUT_QUEUE=true by default, so index updates are queued - make sure a queue worker is running (php artisan queue:work or php artisan queue:listen), since QUEUE_CONNECTION=database.
  5. Push the index settings (filterable/sortable/searchable attributes, defined per-model in config/scout.php) to Meilisearch, then import existing records:
php artisan scout:sync-index-settings
php artisan scout:import "App\Models\Trove"
php artisan scout:import "App\Models\Collection"

Re-run both sync-index-settings and the import commands whenever you change a model's toSearchableArray() or the index-settings block in config/scout.php.

In production: Meilisearch is required for the full ranked/faceted browse experience — without it (SCOUT_DRIVER unset/null, or the engine unreachable) BrowseAll degrades to an unranked, date-ordered database listing with a "search unavailable" notice; filters still work, but there's no relevance ranking, typo tolerance or facet counts. On first deploy, and again after any schema/index change, run scout:sync-index-settings then scout:import for both App\Models\Trove and App\Models\Collection. Set SCOUT_QUEUE=true (queues index updates instead of running them synchronously in the request) and keep a queue worker running (php artisan queue:work). The Laravel scheduler must also be running (cron calling php artisan schedule:run every minute, or schedule:work under Supervisor) — it drives a nightly scout:import reconciliation for both models (app/Console/Kernel.php) that repairs any index drift left by a request where the engine was briefly unreachable.

About

A library of resources linked to the Let's Eat community of practice - Institute for Agroecology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - stats4sd/ifa-library: A library of resources linked to the Let's Eat community of practice - Institute for Agroecology · GitHub
Skip to content

Repository files navigation

Resources Site Template

Setup for Local Development

  1. Clone the repository
  2. Copy the .env.example file to .env
  3. In the .env file add your database credentials and set BRAND_ORG_NAME. See config/branding.php for the full list of branding options including colours, logo, and images.
  4. Create the local MySQL database if needed (e.g. mysql -u root -e "CREATE DATABASE resources_site_template;")
  5. Run composer install to install PHP dependencies
  6. Run npm install to install JavaScript dependencies
  7. Run php artisan key:generate to set the application key
  8. Run php artisan migrate --seed to set up the database with tables and seed
  9. Run npm run dev to set Vite running, which reloads assets on changes
  10. If you're using Laravel Valet or Herd, go to http://resources-site-template.test in your browser. Otherwise, run php artisan serve and go to the provided URL.

If you've run the seeders, you can log in with test@example.com and password 'password'.

To seed example troves, collections, and tags for local development, run the example data seeder separately after the main seed:

php artisan db:seed --class="Database\Seeders\Example\ExampleDataSeeder"

File Storage (AWS S3)

The app uses AWS S3 for file storage. Set up an S3 bucket and add your credentials to .env — see .env.example for the required AWS_* variables. It's recommended to use S3 locally too so your setup matches production.

If you don't have S3 set up, you can use the local public disk for development by setting FILESYSTEM_DISK=local and MEDIA_DISK=public in your .env, then running php artisan storage:link. Note that files won't persist in the same way as S3.

Meilisearch

Search is powered by Meilisearch. The SCOUT_DRIVER config defaults to null (search disabled, no external service required), so search only works once you explicitly set SCOUT_DRIVER=meilisearch in your .env and have Meilisearch running. To keep search disabled locally, either leave SCOUT_DRIVER unset or set it to null.

To run Meilisearch locally:

  1. Install Meilisearch - instructions here.
  2. Run meilisearch --master-key="aSampleMasterKey" - keep this running in a separate terminal window.
  3. In your .env, uncomment/set SCOUT_DRIVER=meilisearch and check MEILISEARCH_HOST/MEILISEARCH_KEY match the instance above (MEILISEARCH_KEY must match the --master-key you started Meilisearch with).
  4. SCOUT_QUEUE=true by default, so index updates are queued - make sure a queue worker is running (php artisan queue:work or php artisan queue:listen), since QUEUE_CONNECTION=database.
  5. Push the index settings (filterable/sortable/searchable attributes, defined per-model in config/scout.php) to Meilisearch, then import existing records:
php artisan scout:sync-index-settings
php artisan scout:import "App\Models\Trove"
php artisan scout:import "App\Models\Collection"

Re-run both sync-index-settings and the import commands whenever you change a model's toSearchableArray() or the index-settings block in config/scout.php.

In production: Meilisearch is required for the full ranked/faceted browse experience — without it (SCOUT_DRIVER unset/null, or the engine unreachable) BrowseAll degrades to an unranked, date-ordered database listing with a "search unavailable" notice; filters still work, but there's no relevance ranking, typo tolerance or facet counts. On first deploy, and again after any schema/index change, run scout:sync-index-settings then scout:import for both App\Models\Trove and App\Models\Collection. Set SCOUT_QUEUE=true (queues index updates instead of running them synchronously in the request) and keep a queue worker running (php artisan queue:work). The Laravel scheduler must also be running (cron calling php artisan schedule:run every minute, or schedule:work under Supervisor) — it drives a nightly scout:import reconciliation for both models (app/Console/Kernel.php) that repairs any index drift left by a request where the engine was briefly unreachable.

About

A library of resources linked to the Let's Eat community of practice - Institute for Agroecology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - stats4sd/ifa-library: A library of resources linked to the Let's Eat community of practice - Institute for Agroecology · GitHub
Skip to content

Repository files navigation

Resources Site Template

Setup for Local Development

  1. Clone the repository
  2. Copy the .env.example file to .env
  3. In the .env file add your database credentials and set BRAND_ORG_NAME. See config/branding.php for the full list of branding options including colours, logo, and images.
  4. Create the local MySQL database if needed (e.g. mysql -u root -e "CREATE DATABASE resources_site_template;")
  5. Run composer install to install PHP dependencies
  6. Run npm install to install JavaScript dependencies
  7. Run php artisan key:generate to set the application key
  8. Run php artisan migrate --seed to set up the database with tables and seed
  9. Run npm run dev to set Vite running, which reloads assets on changes
  10. If you're using Laravel Valet or Herd, go to http://resources-site-template.test in your browser. Otherwise, run php artisan serve and go to the provided URL.

If you've run the seeders, you can log in with test@example.com and password 'password'.

To seed example troves, collections, and tags for local development, run the example data seeder separately after the main seed:

php artisan db:seed --class="Database\Seeders\Example\ExampleDataSeeder"

File Storage (AWS S3)

The app uses AWS S3 for file storage. Set up an S3 bucket and add your credentials to .env — see .env.example for the required AWS_* variables. It's recommended to use S3 locally too so your setup matches production.

If you don't have S3 set up, you can use the local public disk for development by setting FILESYSTEM_DISK=local and MEDIA_DISK=public in your .env, then running php artisan storage:link. Note that files won't persist in the same way as S3.

Meilisearch

Search is powered by Meilisearch. The SCOUT_DRIVER config defaults to null (search disabled, no external service required), so search only works once you explicitly set SCOUT_DRIVER=meilisearch in your .env and have Meilisearch running. To keep search disabled locally, either leave SCOUT_DRIVER unset or set it to null.

To run Meilisearch locally:

  1. Install Meilisearch - instructions here.
  2. Run meilisearch --master-key="aSampleMasterKey" - keep this running in a separate terminal window.
  3. In your .env, uncomment/set SCOUT_DRIVER=meilisearch and check MEILISEARCH_HOST/MEILISEARCH_KEY match the instance above (MEILISEARCH_KEY must match the --master-key you started Meilisearch with).
  4. SCOUT_QUEUE=true by default, so index updates are queued - make sure a queue worker is running (php artisan queue:work or php artisan queue:listen), since QUEUE_CONNECTION=database.
  5. Push the index settings (filterable/sortable/searchable attributes, defined per-model in config/scout.php) to Meilisearch, then import existing records:
php artisan scout:sync-index-settings
php artisan scout:import "App\Models\Trove"
php artisan scout:import "App\Models\Collection"

Re-run both sync-index-settings and the import commands whenever you change a model's toSearchableArray() or the index-settings block in config/scout.php.

In production: Meilisearch is required for the full ranked/faceted browse experience — without it (SCOUT_DRIVER unset/null, or the engine unreachable) BrowseAll degrades to an unranked, date-ordered database listing with a "search unavailable" notice; filters still work, but there's no relevance ranking, typo tolerance or facet counts. On first deploy, and again after any schema/index change, run scout:sync-index-settings then scout:import for both App\Models\Trove and App\Models\Collection. Set SCOUT_QUEUE=true (queues index updates instead of running them synchronously in the request) and keep a queue worker running (php artisan queue:work). The Laravel scheduler must also be running (cron calling php artisan schedule:run every minute, or schedule:work under Supervisor) — it drives a nightly scout:import reconciliation for both models (app/Console/Kernel.php) that repairs any index drift left by a request where the engine was briefly unreachable.

About

A library of resources linked to the Let's Eat community of practice - Institute for Agroecology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - stats4sd/ifa-library: A library of resources linked to the Let's Eat community of practice - Institute for Agroecology · GitHub
Skip to content

Repository files navigation

Resources Site Template

Setup for Local Development

  1. Clone the repository
  2. Copy the .env.example file to .env
  3. In the .env file add your database credentials and set BRAND_ORG_NAME. See config/branding.php for the full list of branding options including colours, logo, and images.
  4. Create the local MySQL database if needed (e.g. mysql -u root -e "CREATE DATABASE resources_site_template;")
  5. Run composer install to install PHP dependencies
  6. Run npm install to install JavaScript dependencies
  7. Run php artisan key:generate to set the application key
  8. Run php artisan migrate --seed to set up the database with tables and seed
  9. Run npm run dev to set Vite running, which reloads assets on changes
  10. If you're using Laravel Valet or Herd, go to http://resources-site-template.test in your browser. Otherwise, run php artisan serve and go to the provided URL.

If you've run the seeders, you can log in with test@example.com and password 'password'.

To seed example troves, collections, and tags for local development, run the example data seeder separately after the main seed:

php artisan db:seed --class="Database\Seeders\Example\ExampleDataSeeder"

File Storage (AWS S3)

The app uses AWS S3 for file storage. Set up an S3 bucket and add your credentials to .env — see .env.example for the required AWS_* variables. It's recommended to use S3 locally too so your setup matches production.

If you don't have S3 set up, you can use the local public disk for development by setting FILESYSTEM_DISK=local and MEDIA_DISK=public in your .env, then running php artisan storage:link. Note that files won't persist in the same way as S3.

Meilisearch

Search is powered by Meilisearch. The SCOUT_DRIVER config defaults to null (search disabled, no external service required), so search only works once you explicitly set SCOUT_DRIVER=meilisearch in your .env and have Meilisearch running. To keep search disabled locally, either leave SCOUT_DRIVER unset or set it to null.

To run Meilisearch locally:

  1. Install Meilisearch - instructions here.
  2. Run meilisearch --master-key="aSampleMasterKey" - keep this running in a separate terminal window.
  3. In your .env, uncomment/set SCOUT_DRIVER=meilisearch and check MEILISEARCH_HOST/MEILISEARCH_KEY match the instance above (MEILISEARCH_KEY must match the --master-key you started Meilisearch with).
  4. SCOUT_QUEUE=true by default, so index updates are queued - make sure a queue worker is running (php artisan queue:work or php artisan queue:listen), since QUEUE_CONNECTION=database.
  5. Push the index settings (filterable/sortable/searchable attributes, defined per-model in config/scout.php) to Meilisearch, then import existing records:
php artisan scout:sync-index-settings
php artisan scout:import "App\Models\Trove"
php artisan scout:import "App\Models\Collection"

Re-run both sync-index-settings and the import commands whenever you change a model's toSearchableArray() or the index-settings block in config/scout.php.

In production: Meilisearch is required for the full ranked/faceted browse experience — without it (SCOUT_DRIVER unset/null, or the engine unreachable) BrowseAll degrades to an unranked, date-ordered database listing with a "search unavailable" notice; filters still work, but there's no relevance ranking, typo tolerance or facet counts. On first deploy, and again after any schema/index change, run scout:sync-index-settings then scout:import for both App\Models\Trove and App\Models\Collection. Set SCOUT_QUEUE=true (queues index updates instead of running them synchronously in the request) and keep a queue worker running (php artisan queue:work). The Laravel scheduler must also be running (cron calling php artisan schedule:run every minute, or schedule:work under Supervisor) — it drives a nightly scout:import reconciliation for both models (app/Console/Kernel.php) that repairs any index drift left by a request where the engine was briefly unreachable.

About

A library of resources linked to the Let's Eat community of practice - Institute for Agroecology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - stats4sd/ifa-library: A library of resources linked to the Let's Eat community of practice - Institute for Agroecology · GitHub
Skip to content

Repository files navigation

Resources Site Template

Setup for Local Development

  1. Clone the repository
  2. Copy the .env.example file to .env
  3. In the .env file add your database credentials and set BRAND_ORG_NAME. See config/branding.php for the full list of branding options including colours, logo, and images.
  4. Create the local MySQL database if needed (e.g. mysql -u root -e "CREATE DATABASE resources_site_template;")
  5. Run composer install to install PHP dependencies
  6. Run npm install to install JavaScript dependencies
  7. Run php artisan key:generate to set the application key
  8. Run php artisan migrate --seed to set up the database with tables and seed
  9. Run npm run dev to set Vite running, which reloads assets on changes
  10. If you're using Laravel Valet or Herd, go to http://resources-site-template.test in your browser. Otherwise, run php artisan serve and go to the provided URL.

If you've run the seeders, you can log in with test@example.com and password 'password'.

To seed example troves, collections, and tags for local development, run the example data seeder separately after the main seed:

php artisan db:seed --class="Database\Seeders\Example\ExampleDataSeeder"

File Storage (AWS S3)

The app uses AWS S3 for file storage. Set up an S3 bucket and add your credentials to .env — see .env.example for the required AWS_* variables. It's recommended to use S3 locally too so your setup matches production.

If you don't have S3 set up, you can use the local public disk for development by setting FILESYSTEM_DISK=local and MEDIA_DISK=public in your .env, then running php artisan storage:link. Note that files won't persist in the same way as S3.

Meilisearch

Search is powered by Meilisearch. The SCOUT_DRIVER config defaults to null (search disabled, no external service required), so search only works once you explicitly set SCOUT_DRIVER=meilisearch in your .env and have Meilisearch running. To keep search disabled locally, either leave SCOUT_DRIVER unset or set it to null.

To run Meilisearch locally:

  1. Install Meilisearch - instructions here.
  2. Run meilisearch --master-key="aSampleMasterKey" - keep this running in a separate terminal window.
  3. In your .env, uncomment/set SCOUT_DRIVER=meilisearch and check MEILISEARCH_HOST/MEILISEARCH_KEY match the instance above (MEILISEARCH_KEY must match the --master-key you started Meilisearch with).
  4. SCOUT_QUEUE=true by default, so index updates are queued - make sure a queue worker is running (php artisan queue:work or php artisan queue:listen), since QUEUE_CONNECTION=database.
  5. Push the index settings (filterable/sortable/searchable attributes, defined per-model in config/scout.php) to Meilisearch, then import existing records:
php artisan scout:sync-index-settings
php artisan scout:import "App\Models\Trove"
php artisan scout:import "App\Models\Collection"

Re-run both sync-index-settings and the import commands whenever you change a model's toSearchableArray() or the index-settings block in config/scout.php.

In production: Meilisearch is required for the full ranked/faceted browse experience — without it (SCOUT_DRIVER unset/null, or the engine unreachable) BrowseAll degrades to an unranked, date-ordered database listing with a "search unavailable" notice; filters still work, but there's no relevance ranking, typo tolerance or facet counts. On first deploy, and again after any schema/index change, run scout:sync-index-settings then scout:import for both App\Models\Trove and App\Models\Collection. Set SCOUT_QUEUE=true (queues index updates instead of running them synchronously in the request) and keep a queue worker running (php artisan queue:work). The Laravel scheduler must also be running (cron calling php artisan schedule:run every minute, or schedule:work under Supervisor) — it drives a nightly scout:import reconciliation for both models (app/Console/Kernel.php) that repairs any index drift left by a request where the engine was briefly unreachable.

About

A library of resources linked to the Let's Eat community of practice - Institute for Agroecology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - stats4sd/ifa-library: A library of resources linked to the Let's Eat community of practice - Institute for Agroecology · GitHub
Skip to content

Repository files navigation

Resources Site Template

Setup for Local Development

  1. Clone the repository
  2. Copy the .env.example file to .env
  3. In the .env file add your database credentials and set BRAND_ORG_NAME. See config/branding.php for the full list of branding options including colours, logo, and images.
  4. Create the local MySQL database if needed (e.g. mysql -u root -e "CREATE DATABASE resources_site_template;")
  5. Run composer install to install PHP dependencies
  6. Run npm install to install JavaScript dependencies
  7. Run php artisan key:generate to set the application key
  8. Run php artisan migrate --seed to set up the database with tables and seed
  9. Run npm run dev to set Vite running, which reloads assets on changes
  10. If you're using Laravel Valet or Herd, go to http://resources-site-template.test in your browser. Otherwise, run php artisan serve and go to the provided URL.

If you've run the seeders, you can log in with test@example.com and password 'password'.

To seed example troves, collections, and tags for local development, run the example data seeder separately after the main seed:

php artisan db:seed --class="Database\Seeders\Example\ExampleDataSeeder"

File Storage (AWS S3)

The app uses AWS S3 for file storage. Set up an S3 bucket and add your credentials to .env — see .env.example for the required AWS_* variables. It's recommended to use S3 locally too so your setup matches production.

If you don't have S3 set up, you can use the local public disk for development by setting FILESYSTEM_DISK=local and MEDIA_DISK=public in your .env, then running php artisan storage:link. Note that files won't persist in the same way as S3.

Meilisearch

Search is powered by Meilisearch. The SCOUT_DRIVER config defaults to null (search disabled, no external service required), so search only works once you explicitly set SCOUT_DRIVER=meilisearch in your .env and have Meilisearch running. To keep search disabled locally, either leave SCOUT_DRIVER unset or set it to null.

To run Meilisearch locally:

  1. Install Meilisearch - instructions here.
  2. Run meilisearch --master-key="aSampleMasterKey" - keep this running in a separate terminal window.
  3. In your .env, uncomment/set SCOUT_DRIVER=meilisearch and check MEILISEARCH_HOST/MEILISEARCH_KEY match the instance above (MEILISEARCH_KEY must match the --master-key you started Meilisearch with).
  4. SCOUT_QUEUE=true by default, so index updates are queued - make sure a queue worker is running (php artisan queue:work or php artisan queue:listen), since QUEUE_CONNECTION=database.
  5. Push the index settings (filterable/sortable/searchable attributes, defined per-model in config/scout.php) to Meilisearch, then import existing records:
php artisan scout:sync-index-settings
php artisan scout:import "App\Models\Trove"
php artisan scout:import "App\Models\Collection"

Re-run both sync-index-settings and the import commands whenever you change a model's toSearchableArray() or the index-settings block in config/scout.php.

In production: Meilisearch is required for the full ranked/faceted browse experience — without it (SCOUT_DRIVER unset/null, or the engine unreachable) BrowseAll degrades to an unranked, date-ordered database listing with a "search unavailable" notice; filters still work, but there's no relevance ranking, typo tolerance or facet counts. On first deploy, and again after any schema/index change, run scout:sync-index-settings then scout:import for both App\Models\Trove and App\Models\Collection. Set SCOUT_QUEUE=true (queues index updates instead of running them synchronously in the request) and keep a queue worker running (php artisan queue:work). The Laravel scheduler must also be running (cron calling php artisan schedule:run every minute, or schedule:work under Supervisor) — it drives a nightly scout:import reconciliation for both models (app/Console/Kernel.php) that repairs any index drift left by a request where the engine was briefly unreachable.

About

A library of resources linked to the Let's Eat community of practice - Institute for Agroecology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - stats4sd/ifa-library: A library of resources linked to the Let's Eat community of practice - Institute for Agroecology · GitHub
Skip to content

Repository files navigation

Resources Site Template

Setup for Local Development

  1. Clone the repository
  2. Copy the .env.example file to .env
  3. In the .env file add your database credentials and set BRAND_ORG_NAME. See config/branding.php for the full list of branding options including colours, logo, and images.
  4. Create the local MySQL database if needed (e.g. mysql -u root -e "CREATE DATABASE resources_site_template;")
  5. Run composer install to install PHP dependencies
  6. Run npm install to install JavaScript dependencies
  7. Run php artisan key:generate to set the application key
  8. Run php artisan migrate --seed to set up the database with tables and seed
  9. Run npm run dev to set Vite running, which reloads assets on changes
  10. If you're using Laravel Valet or Herd, go to http://resources-site-template.test in your browser. Otherwise, run php artisan serve and go to the provided URL.

If you've run the seeders, you can log in with test@example.com and password 'password'.

To seed example troves, collections, and tags for local development, run the example data seeder separately after the main seed:

php artisan db:seed --class="Database\Seeders\Example\ExampleDataSeeder"

File Storage (AWS S3)

The app uses AWS S3 for file storage. Set up an S3 bucket and add your credentials to .env — see .env.example for the required AWS_* variables. It's recommended to use S3 locally too so your setup matches production.

If you don't have S3 set up, you can use the local public disk for development by setting FILESYSTEM_DISK=local and MEDIA_DISK=public in your .env, then running php artisan storage:link. Note that files won't persist in the same way as S3.

Meilisearch

Search is powered by Meilisearch. The SCOUT_DRIVER config defaults to null (search disabled, no external service required), so search only works once you explicitly set SCOUT_DRIVER=meilisearch in your .env and have Meilisearch running. To keep search disabled locally, either leave SCOUT_DRIVER unset or set it to null.

To run Meilisearch locally:

  1. Install Meilisearch - instructions here.
  2. Run meilisearch --master-key="aSampleMasterKey" - keep this running in a separate terminal window.
  3. In your .env, uncomment/set SCOUT_DRIVER=meilisearch and check MEILISEARCH_HOST/MEILISEARCH_KEY match the instance above (MEILISEARCH_KEY must match the --master-key you started Meilisearch with).
  4. SCOUT_QUEUE=true by default, so index updates are queued - make sure a queue worker is running (php artisan queue:work or php artisan queue:listen), since QUEUE_CONNECTION=database.
  5. Push the index settings (filterable/sortable/searchable attributes, defined per-model in config/scout.php) to Meilisearch, then import existing records:
php artisan scout:sync-index-settings
php artisan scout:import "App\Models\Trove"
php artisan scout:import "App\Models\Collection"

Re-run both sync-index-settings and the import commands whenever you change a model's toSearchableArray() or the index-settings block in config/scout.php.

In production: Meilisearch is required for the full ranked/faceted browse experience — without it (SCOUT_DRIVER unset/null, or the engine unreachable) BrowseAll degrades to an unranked, date-ordered database listing with a "search unavailable" notice; filters still work, but there's no relevance ranking, typo tolerance or facet counts. On first deploy, and again after any schema/index change, run scout:sync-index-settings then scout:import for both App\Models\Trove and App\Models\Collection. Set SCOUT_QUEUE=true (queues index updates instead of running them synchronously in the request) and keep a queue worker running (php artisan queue:work). The Laravel scheduler must also be running (cron calling php artisan schedule:run every minute, or schedule:work under Supervisor) — it drives a nightly scout:import reconciliation for both models (app/Console/Kernel.php) that repairs any index drift left by a request where the engine was briefly unreachable.

About

A library of resources linked to the Let's Eat community of practice - Institute for Agroecology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages