├── .editorconfig ├── .forestry └── settings.yml ├── .gitignore ├── LICENSE ├── README.md ├── archetypes └── default.md ├── assets ├── js │ ├── bootstrap.js │ └── script.js ├── plugins │ ├── search │ │ ├── fuse.js │ │ └── search.js │ └── webfont │ │ └── webfont-loader-2.js └── scss │ ├── _buttons.scss │ ├── _common.scss │ ├── _mixins.scss │ ├── _typography.scss │ ├── bootstrap │ ├── _accordion.scss │ ├── _alert.scss │ ├── _badge.scss │ ├── _bootstrap-grid.scss │ ├── _bootstrap-reboot.scss │ ├── _bootstrap-utilities.scss │ ├── _bootstrap.scss │ ├── _breadcrumb.scss │ ├── _button-group.scss │ ├── _buttons.scss │ ├── _card.scss │ ├── _carousel.scss │ ├── _close.scss │ ├── _containers.scss │ ├── _dropdown.scss │ ├── _forms.scss │ ├── _functions.scss │ ├── _grid.scss │ ├── _helpers.scss │ ├── _images.scss │ ├── _list-group.scss │ ├── _mixins.scss │ ├── _modal.scss │ ├── _nav.scss │ ├── _navbar.scss │ ├── _offcanvas.scss │ ├── _pagination.scss │ ├── _popover.scss │ ├── _progress.scss │ ├── _reboot.scss │ ├── _root.scss │ ├── _spinners.scss │ ├── _tables.scss │ ├── _toasts.scss │ ├── _tooltip.scss │ ├── _transitions.scss │ ├── _type.scss │ ├── _utilities.scss │ ├── _variables.scss │ ├── forms │ │ ├── _floating-labels.scss │ │ ├── _form-check.scss │ │ ├── _form-control.scss │ │ ├── _form-range.scss │ │ ├── _form-select.scss │ │ ├── _form-text.scss │ │ ├── _input-group.scss │ │ ├── _labels.scss │ │ └── _validation.scss │ ├── helpers │ │ ├── _clearfix.scss │ │ ├── _colored-links.scss │ │ ├── _position.scss │ │ ├── _ratio.scss │ │ ├── _stretched-link.scss │ │ ├── _text-truncation.scss │ │ └── _visually-hidden.scss │ ├── mixins │ │ ├── _alert.scss │ │ ├── _border-radius.scss │ │ ├── _box-shadow.scss │ │ ├── _breakpoints.scss │ │ ├── _buttons.scss │ │ ├── _caret.scss │ │ ├── _clearfix.scss │ │ ├── _color-scheme.scss │ │ ├── _container.scss │ │ ├── _deprecate.scss │ │ ├── _forms.scss │ │ ├── _gradients.scss │ │ ├── _grid.scss │ │ ├── _image.scss │ │ ├── _list-group.scss │ │ ├── _lists.scss │ │ ├── _pagination.scss │ │ ├── _reset-text.scss │ │ ├── _resize.scss │ │ ├── _table-variants.scss │ │ ├── _text-truncate.scss │ │ ├── _transition.scss │ │ ├── _utilities.scss │ │ └── _visually-hidden.scss │ ├── utilities │ │ └── _api.scss │ └── vendor │ │ └── _rfs.scss │ ├── style.scss │ └── templates │ ├── _main.scss │ └── _navigation.scss ├── config.toml ├── exampleSite ├── .hugo_build.lock ├── assets │ ├── images │ │ ├── author.png │ │ ├── banner-bg-shape.svg │ │ ├── banner.png │ │ ├── favicon.png │ │ ├── footer-bg-shape.svg │ │ ├── logo.png │ │ ├── map.png │ │ ├── post │ │ │ ├── how-to-use-geeky.jpeg │ │ │ ├── post-1.png │ │ │ ├── post-1 │ │ │ │ ├── Screenshot from 2024-03-25 09-46-54.png │ │ │ │ ├── pic-3.png │ │ │ │ ├── pic1.png │ │ │ │ ├── pic2.png │ │ │ │ ├── pic3.png │ │ │ │ ├── pic4.png │ │ │ │ └── pic5.png │ │ │ ├── post-2.png │ │ │ ├── post-3.png │ │ │ ├── post-4.png │ │ │ ├── post-5.png │ │ │ ├── post-6.png │ │ │ ├── post-7.png │ │ │ └── post-8.png │ │ └── promotion.png │ ├── jsconfig.json │ └── scss │ │ └── custom.scss ├── config │ └── _default │ │ ├── config.toml │ │ ├── menus.toml │ │ ├── module.toml │ │ └── params.toml ├── content │ ├── about.md │ ├── blog │ │ ├── _index.md │ │ ├── how-to-use-geeky.md │ │ ├── post-2.md │ │ ├── post-3.md │ │ ├── post-4.md │ │ ├── post-5.md │ │ ├── post-6.md │ │ ├── post-7.md │ │ └── post-8.md │ ├── contact.md │ ├── privacy-policy.md │ └── search.md ├── go.mod ├── netlify.toml └── static │ └── .htaccess ├── layouts ├── 404.html ├── _default │ ├── about.html │ ├── baseof.html │ ├── contact.html │ ├── index.json │ ├── list.html │ ├── post.html │ ├── robots.txt │ ├── search.html │ ├── single.html │ ├── sitemap.xml │ └── terms.html ├── index.html └── partials │ ├── footer.html │ ├── head.html │ ├── header.html │ ├── page-header.html │ ├── script.html │ ├── style.html │ └── widgets │ ├── about.html │ ├── categories.html │ ├── newsletter.html │ ├── recent-post.html │ └── widget-wrapper.html ├── netlify.toml ├── package.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | ; https://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_size = 2 9 | indent_style = space 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.forestry/settings.yml: -------------------------------------------------------------------------------- 1 | --- 2 | new_page_extension: md 3 | auto_deploy: false 4 | admin_path: '' 5 | webhook_url: 6 | sections: 7 | - type: heading 8 | label: Homepage 9 | - type: document 10 | path: exampleSite/content/english/_index.md 11 | label: Homepage (en) 12 | - type: document 13 | path: exampleSite/content/deutsch/_index.md 14 | label: Homepage (de) 15 | - type: heading 16 | label: Blog 17 | - type: document 18 | path: exampleSite/content/english/blog/_index.md 19 | label: Blog Page (en) 20 | - type: document 21 | path: exampleSite/content/deutsch/blog/_index.md 22 | label: Blog Page (de) 23 | - type: directory 24 | path: exampleSite/content/english/blog 25 | label: Blog Post (en) 26 | create: documents 27 | match: "**/*" 28 | exclude: _index.md 29 | templates: 30 | - post 31 | - type: directory 32 | path: exampleSite/content/deutsch/blog 33 | label: Blog Post (de) 34 | create: documents 35 | match: "**/*" 36 | exclude: _index.md 37 | templates: 38 | - post 39 | - type: heading 40 | label: Others Page 41 | - type: document 42 | path: exampleSite/content/english/contact/_index.md 43 | label: Contact (en) 44 | - type: document 45 | path: exampleSite/content/deutsch/contact/_index.md 46 | label: Contact (de) 47 | - type: document 48 | path: exampleSite/content/english/pricing/_index.md 49 | label: Pricing (en) 50 | - type: document 51 | path: exampleSite/content/deutsch/pricing/_index.md 52 | label: Pricing (de) 53 | - type: document 54 | path: exampleSite/content/english/faq/_index.md 55 | label: FAQ (en) 56 | - type: document 57 | path: exampleSite/content/deutsch/faq/_index.md 58 | label: FAQ (de) 59 | - type: heading 60 | label: All Pages 61 | - type: directory 62 | path: exampleSite/content 63 | label: All Pages 64 | create: all 65 | match: "**/*" 66 | exclude: _index.md 67 | templates: 68 | - new-page 69 | - type: heading 70 | label: Configuration 71 | - type: document 72 | path: exampleSite/config/_default/config.toml 73 | label: Configuration 74 | - type: document 75 | path: exampleSite/config/_default/params.toml 76 | label: Parameters 77 | - type: document 78 | path: config.toml 79 | label: Variables & Plugins 80 | match: "**/*" 81 | - type: document 82 | path: exampleSite/config/_default/languages.toml 83 | label: Languages 84 | - type: document 85 | path: exampleSite/config/_default/menus.en.toml 86 | label: Menu (en) 87 | - type: document 88 | path: exampleSite/config/_default/menus.de.toml 89 | label: Menu (de) 90 | match: "**/*" 91 | upload_dir: exampleSite/static/images 92 | public_path: "/images" 93 | front_matter_path: '' 94 | use_front_matter_path: false 95 | file_template: ":filename:" 96 | build: 97 | preview_env: 98 | - HUGO_ENV=staging 99 | - HUGO_VERSION=0.81.0 100 | preview_output_directory: public 101 | preview_docker_image: forestryio/hugo:latest 102 | mount_path: "/srv" 103 | working_dir: "/srv" 104 | instant_preview_command: hugo server -D -E -F --port 8080 --bind 0.0.0.0 --renderToDisk 105 | -d public 106 | version: 0.81.0 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Thumbs.db 2 | .DS_Store 3 | .dist 4 | .tmp 5 | .sass-cache 6 | npm-debug.log 7 | node_modules 8 | builds 9 | package-lock.json 10 | public 11 | resources 12 | .hugo_build.lock 13 | jsconfig.json 14 | hugo_stats.json 15 | go.sum -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 - Present, Statichunt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |
Get Geeked out by Geeky, a personal Hugo blog theme that is fully responsive and super-fast.
4 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
23 |
28 | 29 |  30 |
31 | 32 | --- 33 | ## Key Features 34 | - Hugo module support 35 | - Google analytics, AdSense support 36 | - Image optimize with hugo pipe 37 | - CSS and JS bundle with hugo pipe 38 | - Netlify settings predefine 39 | - Forestry cms pre-configured 40 | - Google font loads from webfont loader 41 | - Caching enable 42 | - Color and fonts variable in config file 43 | - Contact form Support 44 | - Search by fuse.js 45 | - Mailchimp integrate 46 | - GDPR consent enable 47 | - Google page speed optimized 48 | - Open graph meta tag 49 | - Twitter card meta tag 50 | 51 | 52 | ## Local development 53 | 54 | ```bash 55 | # clone the repository 56 | git clone git@github.com:statichunt/geeky-hugo.git 57 | 58 | # cd in the project directory 59 | $ cd geeky-hugo/exampleSite/ 60 | 61 | # Start local dev server 62 | $ hugo server --themesDir ../.. 63 | ``` 64 | 65 | ## Deployment and hosting 66 | 67 | ## Netlify 68 | 69 | [](https://app.netlify.com/start/deploy?repository=https://github.com/statichunt/geeky-hugo) 70 | 71 | Follow these steps. 72 | 73 | 74 | ## Render 75 | 76 |  77 | 78 | To deploy your Hugo site on Render, follow these steps: 79 | 80 | 1. **Create a New Static Site** on Render's dashboard. 81 | 2. **Link the Git Repository** that contains your Hugo site. 82 | 3. Navigate to **Settings > Build & Deploy**. 83 | 84 | Configure the build settings as follows: 85 | 86 | - **Build Command**: 87 | 88 | ```bash 89 | mkdir geeky-hugo; mv * geeky-hugo/.; hugo -s geeky-hugo/exampleSite --minify --gc --themesDir ../.. 90 | ``` 91 | 92 | - **Publish Directory**: 93 | 94 | ```bash 95 | geeky-hugo/exampleSite/public 96 | ``` 97 | 98 | 99 | ## Reporting Issues 100 | We use GitHub Issues as the official bug tracker for the geeky Template. Please Search [existing 101 | issues](https://github.com/statichunt/geeky-hugo/issues). Someone may have already reported the same problem. 102 | If your problem or idea has not been addressed yet, feel free to [open a new 103 | issue](https://github.com/statichunt/geeky-hugo/issues). 104 | 105 | 108 | 109 | 110 | ## License 111 | Copyright © Designed and developed by [Statichunt](https://statichunt.com) 112 | 113 | **Code License:** Released under the [MIT](https://github.com/statichunt/geeky-hugo/blob/master/LICENSE) license. 114 | 115 | **Image license:** The images are only for demonstration purposes. They have their licenses. We don't have permission to 116 | share those images. 117 | 118 | 119 | ## Special Thanks 120 | - [Bootstrap](https://getbootstrap.com) 121 | - [Jquery](https://jquery.com) 122 | - [Font Awesome Icons](https://fontawesome.com) 123 | - [Fuse Js](https://fusejs.io) 124 | - [Google Fonts](https://fonts.google.com/) 125 | - [All Contributors](https://github.com/statichunt/geeky-hugo/graphs/contributors) 126 | -------------------------------------------------------------------------------- /archetypes/default.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{ replace .Name "-" " " | title }}" 3 | date: {{ .Date }} 4 | draft: true 5 | sitemapExclude: false 6 | # description 7 | description: "This is meta description" 8 | --- -------------------------------------------------------------------------------- /assets/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | // bootstrap js components 2 | // import Alert from "js/bootstrap/src/alert"; 3 | // import Button from "js/bootstrap/src/button"; 4 | // import Carousel from "js/bootstrap/src/carousel"; 5 | import Collapse from "js/bootstrap/src/collapse"; 6 | import Dropdown from "js/bootstrap/src/dropdown"; 7 | import Modal from "js/bootstrap/src/modal"; 8 | import Offcanvas from "js/bootstrap/src/offcanvas"; 9 | // import Popover from "js/bootstrap/src/popover"; 10 | // import ScrollSpy from "js/bootstrap/src/scrollspy"; 11 | import Tab from "js/bootstrap/src/tab"; 12 | // import Toast from "js/bootstrap/src/toast"; 13 | // import Tooltip from "js/bootstrap/src/tooltip"; 14 | 15 | // bootstrap popover and toats 16 | // (function () { 17 | // "use strict"; 18 | // let toastElList = [].slice.call(document.querySelectorAll(".toast")); 19 | // let toastList = toastElList.map(function (toastEl) { 20 | // return new Toast(toastEl); 21 | // }); 22 | 23 | // toastList.forEach(function (toast) { 24 | // toast.show(); 25 | // }); 26 | 27 | // let popoverTriggerList = [].slice.call( 28 | // document.querySelectorAll('[data-bs-toggle="popover"]') 29 | // ); 30 | // popoverTriggerList.map(function (popoverTriggerEl) { 31 | // return new Popover(popoverTriggerEl); 32 | // }); 33 | // })(); 34 | -------------------------------------------------------------------------------- /assets/js/script.js: -------------------------------------------------------------------------------- 1 | // main script 2 | (function () { 3 | "use strict"; 4 | })(); 5 | -------------------------------------------------------------------------------- /assets/plugins/search/search.js: -------------------------------------------------------------------------------- 1 | summaryInclude = 100; 2 | var fuseOptions = { 3 | isCaseSensitive: false, 4 | includeScore: false, 5 | shouldSort: true, 6 | includeMatches: true, 7 | findAllMatches: false, 8 | minMatchCharLength: 3, 9 | location: 0, 10 | threshold: 0.6, 11 | distance: 50, 12 | useExtendedSearch: false, 13 | ignoreLocation: false, 14 | ignoreFieldNorm: false, 15 | keys: [ 16 | { 17 | name: "title", 18 | weight: 0.8, 19 | }, 20 | { 21 | name: "tags", 22 | weight: 0.5, 23 | }, 24 | { 25 | name: "categories", 26 | weight: 0.5, 27 | }, 28 | { 29 | name: "contents", 30 | weight: 0.3, 31 | }, 32 | ], 33 | }; 34 | 35 | var searchQuery = param("s"); 36 | if (searchQuery) { 37 | document.querySelector("#search-query").value = searchQuery; 38 | executeSearch(searchQuery); 39 | } 40 | 41 | function executeSearch(searchQuery) { 42 | fetch(indexURL) 43 | .then((res) => res.json()) 44 | .then((data) => { 45 | var pages = data; 46 | var fuse = new Fuse(pages, fuseOptions); 47 | var result = fuse.search(searchQuery); 48 | if (result.length > 0) { 49 | populateResults(result); 50 | } else { 51 | document.querySelector("#search-results").innerHTML = 52 | '