{"id":18718787,"url":"https://github.com/denis-source/portfolio2","last_synced_at":"2026-04-10T02:42:52.428Z","repository":{"id":136600723,"uuid":"526365474","full_name":"Denis-Source/portfolio2","owner":"Denis-Source","description":"Personal portfolio page written in next.js and django","archived":false,"fork":false,"pushed_at":"2023-05-29T10:51:31.000Z","size":1033,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-19T14:16:06.580Z","etag":null,"topics":["django","django-rest-framework","framer-motion","next-theme","nextjs","portfolio-website","python","react","rest-api","scss","telegram-bot","tinymce","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Denis-Source.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-08-18T20:36:06.000Z","updated_at":"2022-12-05T04:55:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"03fc2e6c-686e-4e6e-bd09-368a86613154","html_url":"https://github.com/Denis-Source/portfolio2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Denis-Source/portfolio2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Denis-Source%2Fportfolio2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Denis-Source%2Fportfolio2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Denis-Source%2Fportfolio2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Denis-Source%2Fportfolio2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Denis-Source","download_url":"https://codeload.github.com/Denis-Source/portfolio2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Denis-Source%2Fportfolio2/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266267336,"owners_count":23902346,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","django-rest-framework","framer-motion","next-theme","nextjs","portfolio-website","python","react","rest-api","scss","telegram-bot","tinymce","typescript"],"created_at":"2024-11-07T13:23:00.999Z","updated_at":"2026-04-10T02:42:47.393Z","avatar_url":"https://github.com/Denis-Source.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# portfolio2\n\nPersonal Portfolio page written in next.js and Djnago\n\nhttp://zoloto.cx.ua/\n\nSuccessor of the [portfolio](https://github.com/Denis-Source/portfolio) project\n\n***\n\n## About\nThe project is separated into two parts:\n- [Django](https://www.djangoproject.com/) based backend with [DRF](https://www.django-rest-framework.org/);\n- [next.js](next.js) frontend [react](https://ru.reactjs.org/) framework using [TypeScript](https://www.typescriptlang.org/) programming language and [scss](https://sass-lang.com/) styling modules.\n\n***\n\n### Features\n- [Django](https://www.djangoproject.com/) based [admin](https://docs.djangoproject.com/en/4.1/ref/contrib/admin/) located at: https://api.zoloto.cx.ua/admin that allows full control of the web application content;\n- Both single and collection type models that are used to store data with a [tinyMCE](https://www.tiny.cloud/) rich text editor;\n- [REST](https://ru.wikipedia.org/wiki/REST) endpoinds with nested serializers;\n- [Telegram](https://core.telegram.org/bots/api) based form forwarding;\n- SEO attributes customization;\n- Fast loading speeds on account on [next.js](next.js) (prerendered pages and image optimizations);\n- light and dark themes;\n- advanced form validation;\n- adaptive design;\n***\n### Used libraries and frameworks\n#### Backend\n- `Django 4.1`\n- `jazzmin-jazzmin`\n- `django-solo`\n- `pillow`\n- `djangorestframework`\n- `requests`\n\nThe backend is based on [Django](https://docs.djangoproject.com/en/4.1/releases/4.1/) of 4.1 version with a [DRF](https://www.django-rest-framework.org/), as it provides ease of use of [REST](https://ru.wikipedia.org/wiki/REST) interfaces. To allow full content control, both repetitive (e.g `porfolio cases`, `about tabs`  and `contact cards`) and individual models (e.g.`hero section`, `footer` and `header`) can be changed via the admin page.\n\nSome of the models can be edited with a [tinyMCE](https://django-tinymce.readthedocs.io/en/latest/) rich text editor field.\n\nThe individuality of the corresponding models are preserved via the `django-solo` [SingletonModel](https://pypi.org/project/django-solo/).\n\nSome of the model use media in a form of images, so the `Pillow` library is used.\n\nForm message is stored and then sent via a telegram bot using `requests` library. The message model creation is intercepted using [Django signals](https://docs.djangoproject.com/en/4.1/topics/signals/).\n\n***\n### Frontend\n- `react`\n- `react-dom`\n- `next`\n- `next-themes`\n- `framer-motion`\n- `react-awesome-reveal`\n\nThe frontend is written using [next.js](https://nextjs.org/) [react](https://ru.reactjs.org/) framework with a [server side rendering](https://nextjs.org/docs/basic-features/pages#server-side-rendering) aproach. The project itself is split in a multiple of function based components.\n\nDark and Light themes are provided by [`next-themes`](https://www.npmjs.com/package/next-themes).\nTo avoid complex code, [`framer-motion`](https://www.framer.com/motion/) is used to animate projects filtering.\n\nProject is written in [TypeScript](https://www.typescriptlang.org/) and [SASS](https://sass-lang.com/), styling is heavely inspired yet developed from scratch by [dewi](https://bootstrapmade.com/dewi-free-multi-purpose-html-template/) bootstrap template.\n\nThe form is validated using `onChange` listeners and regular expressions, for example to validate a name the following `re` is used: `NAME_REGEX = /.{3,120}/;`.\n\n***\n\n## Installation\n```sh\ngit clone https://github.com/Denis-Source/portfolio2\n```\n\n### Backend\n```sh\ncd backend/\n\npython3 -m venv env\nsource env/bin/activate\npip install -r requirements.txt\n\npython manage.py runserver\n```\n\n### Frontend\n```sh\ncd frontend/\n\nnpm install\nnpm run dev\n\n# Or\nnpm run build\nnpm run start\n```\n\n***\n\n## Tests\n### web.dev\n![https://i.ibb.co/PDxpztj/image.png](https://i.ibb.co/PDxpztj/image.png)\n\n### Desktop LightHouse test\n![https://i.ibb.co/QCvC99g/image.png](https://i.ibb.co/QCvC99g/image.png)\n\n### Mobile LightHouse test\n![https://i.ibb.co/0V028xj/image.png](https://i.ibb.co/0V028xj/image.png)\n\n### GMetrix\n![https://i.ibb.co/XCz0tqF/image.png](https://i.ibb.co/XCz0tqF/image.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdenis-source%2Fportfolio2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdenis-source%2Fportfolio2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdenis-source%2Fportfolio2/lists"}