41554 blogs · [ { "id": "01a087d7-806b-71ef-935a-3bc07ffd22d2", "title": "A backdoor in a LinkedIn job offer", "url": "https://roman.pt/posts/linkedin-backdoor/", "published_at": "2026-06-15T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc080aeb260", "title": "Agent engineering: smolagents", "url": "https://roman.pt/posts/smolagents-version/", "published_at": "2026-06-08T09:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08124981d", "title": "Agent engineering: Pydantic AI", "url": "https://roman.pt/posts/pydantic-ai-version/", "published_at": "2026-06-07T15:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08211d481", "title": "Agent engineering: Pi SDK", "url": "https://roman.pt/posts/pi-sdk-version/", "published_at": "2026-06-07T10:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08212b313", "title": "Agent engineering: Pi", "url": "https://roman.pt/posts/pi-dev-version/", "published_at": "2026-06-07T09:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc0829aa589", "title": "Agent engineering: Agent SDK", "url": "https://roman.pt/posts/agent-sdk-rewrite/", "published_at": "2026-06-03T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08395ca4f", "title": "Agent engineering: Claude Code", "url": "https://roman.pt/posts/claude-code-as-your-execution-environment/", "published_at": "2026-06-02T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc0847af621", "title": "Committing PyCharm .idea directory", "url": "https://roman.pt/posts/pycharm-idea-directory/", "published_at": "2026-04-08T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc085428873", "title": "Voice Notifications for Claude Code", "url": "https://roman.pt/posts/claude-code-hooks/", "published_at": "2026-03-07T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc085a5d66d", "title": "Smello for HTTP Requests", "url": "https://roman.pt/posts/smello/", "published_at": "2026-03-02T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08633a36e", "title": "Fixing Keyboard Input in tmux", "url": "https://roman.pt/posts/terminal-setup/", "published_at": "2026-02-12T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc086691c23", "title": "Hands Off Development", "url": "https://roman.pt/posts/hands-off-development/", "published_at": "2026-01-13T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc0871f4072", "title": "Cursor Under the Hood", "url": "https://roman.pt/posts/cursor-under-the-hood/", "published_at": "2025-02-23T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08792bb29", "title": "Temporary vs Permanent Errors", "url": "https://roman.pt/posts/temporary-vs-permanent-errors/", "published_at": "2024-05-05T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc088477f19", "title": "Interface-mock-live (IML) pattern for connecting with third-party services in Python applications", "url": "https://roman.pt/posts/iml/", "published_at": "2024-01-08T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc088ce4d7d", "title": "Handling Unset Values in Fastapi With Pydantic", "url": "https://roman.pt/posts/handling-unset-values-in-fastapi-with-pydantic/", "published_at": "2023-12-26T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08978be68", "title": "GitHub Copilot Context", "url": "https://roman.pt/posts/copilot-context/", "published_at": "2023-12-19T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc089c69eb9", "title": "Django Admin and Service Layer", "url": "https://roman.pt/posts/django-admin-and-service-layer/", "published_at": "2023-08-15T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08a237c7b", "title": "Refiner", "url": "https://roman.pt/posts/refiner/", "published_at": "2023-07-11T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08a2ceabe", "title": "From Django class-based views to service functions", "url": "https://roman.pt/posts/django-views-and-service-functions/", "published_at": "2023-04-06T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08ad69596", "title": "Parametrizing Pytest Fixtures", "url": "https://roman.pt/posts/parametrizing-pytest-fixtures/", "published_at": "2023-03-07T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08b7ef44a", "title": "10 Minutes", "url": "https://roman.pt/posts/10-minutes/", "published_at": "2023-02-28T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08bcdc3f9", "title": "How I Make Choices", "url": "https://roman.pt/posts/how-i-make-choices/", "published_at": "2023-02-21T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08bf6e2db", "title": "Feature Flags at Building Radar", "url": "https://roman.pt/posts/feature-flags-at-building-radar/", "published_at": "2023-02-14T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08c4be412", "title": "Say Maybe to Hell Yeah", "url": "https://roman.pt/posts/say-maybe-to-hell-yeah/", "published_at": "2023-01-31T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08cb78917", "title": "7 habit-building techniques I learned from 'Atomic Habits'", "url": "https://roman.pt/posts/atomic-habits/", "published_at": "2023-01-24T00:00:00+00:00" }, { "id": "01a087d7-806b-71ef-935a-3bc08d3ef764", "title": "Simplifying PostgreSQL enum migrations with SQLAlchemy and alembic-enums", "url": "https://roman.pt/posts/alembic-enums/", "published_at": "2023-01-17T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca88ea87b7", "title": "Most Popular Posts of 2022", "url": "https://roman.pt/posts/most-popular-posts-of-2022/", "published_at": "2023-01-10T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca896c16da", "title": "Surviving Late Night Events", "url": "https://roman.pt/posts/surviving-late-night-events/", "published_at": "2023-01-01T11:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8a2aa9e9", "title": "Stop Me Before It's Too Late", "url": "https://roman.pt/posts/stop-me-before-its-too-late/", "published_at": "2022-12-13T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8a4d8566", "title": "Pydantic as a Backward Compatibility Layer", "url": "https://roman.pt/posts/pydantic-as-backward-compatibility-layer/", "published_at": "2022-12-06T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8abc1aad", "title": "Resolve Discussions", "url": "https://roman.pt/posts/resolve-discussions/", "published_at": "2022-08-30T07:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8ae66f52", "title": "Long name, short body", "url": "https://roman.pt/posts/long-name-short-body/", "published_at": "2022-08-16T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8b5bf8c9", "title": "AWS Certified Developer", "url": "https://roman.pt/posts/aws-certified-developer/", "published_at": "2022-08-02T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8b9a648f", "title": "Opportunistic Refactoring", "url": "https://roman.pt/posts/opportunistic-refactoring/", "published_at": "2022-07-26T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8c891203", "title": "Python Performance Profiling", "url": "https://roman.pt/posts/python-performance-profiling/", "published_at": "2022-07-19T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8d67dfdc", "title": "AWS SAM", "url": "https://roman.pt/posts/aws-sam/", "published_at": "2022-07-12T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8e5f1f88", "title": "My setup for a typescript react project", "url": "https://roman.pt/posts/typescript-react-project-setup/", "published_at": "2022-07-05T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8f1fb298", "title": "GitHub Copilot", "url": "https://roman.pt/posts/github-copilot/", "published_at": "2022-06-28T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca8f57bf65", "title": "Be kind to your manager", "url": "https://roman.pt/posts/be-kind-to-your-manager/", "published_at": "2022-06-21T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca900abf38", "title": "Parse JSON-encoded query strings in FastAPI", "url": "https://roman.pt/posts/fastapi-json-query/", "published_at": "2022-06-14T04:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca906eaa24", "title": "AWS Surprise Bill", "url": "https://roman.pt/posts/aws-surprise-bill/", "published_at": "2022-06-07T08:25:15+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca90ce516b", "title": "State of JS 2021", "url": "https://roman.pt/til/2022-06-01/", "published_at": "2022-06-01T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca918e8f93", "title": "DynamoDB", "url": "https://roman.pt/til/2022-05-27/", "published_at": "2022-05-27T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca92056037", "title": "1984 is now", "url": "https://roman.pt/posts/1984/", "published_at": "2022-05-16T13:46:21+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9274edba", "title": "Elastic Beanstalk", "url": "https://roman.pt/til/2022-05-11/", "published_at": "2022-05-11T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca92d492eb", "title": "Django Plausible Proxy", "url": "https://roman.pt/posts/django-plausible-proxy/", "published_at": "2022-04-27T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca934b90b2", "title": "Shared database antipattern. A three-legged race", "url": "https://roman.pt/posts/three-legged-race/", "published_at": "2022-02-11T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca943cb50e", "title": "Tech debt hackathons are a waste of time", "url": "https://roman.pt/posts/tech-debt-hackathons-is-a-waste-of-time/", "published_at": "2022-01-31T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca94812674", "title": "You can use Pydantic in SQLAlchemy fields", "url": "https://roman.pt/posts/pydantic-in-sqlalchemy-fields/", "published_at": "2022-01-19T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca95584c0d", "title": "Dealing with large pull requests", "url": "https://roman.pt/posts/large-pull-requests/", "published_at": "2022-01-08T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca95a47c3d", "title": "Optimize pip install with wheels", "url": "https://roman.pt/posts/optimize-pip-install-with-wheels/", "published_at": "2021-12-22T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca95e32b92", "title": "How to pretty print SQL from Django", "url": "https://roman.pt/posts/pretty-print-django-sql/", "published_at": "2021-12-21T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca962aea92", "title": "User Stories for small teams and individuals", "url": "https://roman.pt/posts/user-stories/", "published_at": "2021-12-10T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca96fe7c08", "title": "SQLAlchemy and Alembic notes", "url": "https://roman.pt/posts/sqlalchemy-and-alembic/", "published_at": "2021-11-28T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9716d5bc", "title": "Codemaps Leaflet", "url": "https://roman.pt/posts/codemaps-leaflet/", "published_at": "2021-11-09T11:23:17+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca97ca94fe", "title": "Time Series Caching with Python and Redis", "url": "https://roman.pt/posts/time-series-caching/", "published_at": "2021-11-01T11:25:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca98a294a6", "title": "Flow: The Psychology of Optimal Experience", "url": "https://roman.pt/posts/flow-book/", "published_at": "2021-10-22T09:11:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca995f7ab2", "title": "Structure Flask Project With Convention Over Configuration", "url": "https://roman.pt/posts/structure-flask-project/", "published_at": "2021-05-05T08:44:26+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9994d913", "title": "21 tools to document your Python project", "url": "https://roman.pt/posts/21-tools-to-document-your-python-project/", "published_at": "2021-03-17T11:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9a070536", "title": "Linter for Python Architecture", "url": "https://roman.pt/posts/python-architecture-linter/", "published_at": "2021-02-23T16:07:08+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9a31f0e2", "title": "Product Management. Explanation for Developers", "url": "https://roman.pt/posts/product-management/", "published_at": "2020-12-21T09:29:19+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9af8d043", "title": "Meeting culture for seniors and veterans", "url": "https://roman.pt/posts/meeting-culture-for-seniors-and-veterans/", "published_at": "2020-12-06T12:56:14+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9b12be7b", "title": "Don't let dicts spoil your code", "url": "https://roman.pt/posts/dont-let-dicts-spoil-your-code/", "published_at": "2020-11-22T00:00:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9b6b3896", "title": "4 Reading mistakes I made", "url": "https://roman.pt/posts/reading-mistakes/", "published_at": "2020-11-20T07:41:05+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9c2434c9", "title": "Alignment Matters", "url": "https://roman.pt/posts/alignment-matters/", "published_at": "2020-10-25T07:42:25+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9c6968b9", "title": "Python code cleanup for beginners. 12 steps to readable and maintainable code.", "url": "https://roman.pt/posts/python-cleanup/", "published_at": "2020-09-18T09:52:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9d3d3d0d", "title": "Boring Meetings and Multitasking", "url": "https://roman.pt/posts/on-boring-meetings-and-multitasking/", "published_at": "2020-09-10T07:48:16+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9dd54f99", "title": "On Burnout", "url": "https://roman.pt/posts/on-burnout/", "published_at": "2020-09-02T08:26:04+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9ddc968c", "title": "5 reasons to love Python type hints", "url": "https://roman.pt/posts/python-type-hints/", "published_at": "2020-08-25T05:53:40+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9e163276", "title": "Accelerate. Five-minute summary", "url": "https://roman.pt/posts/accelerate/", "published_at": "2020-08-15T12:28:00+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9e74c56f", "title": "Feature Branching vs. Continuous Integration", "url": "https://roman.pt/posts/on-feature-branching-vs-continuous-integration/", "published_at": "2020-05-12T09:06:03+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9f3197f7", "title": "On the Code Ownership", "url": "https://roman.pt/posts/on-the-code-ownership/", "published_at": "2020-05-03T08:58:50+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1ca9fec1bab", "title": "On Feature Flags at Doist", "url": "https://roman.pt/posts/on-feature-flags-at-doist/", "published_at": "2020-04-21T09:20:38+00:00" }, { "id": "01a087d7-806c-71a0-868e-e1caa0c64053", "title": "About me", "url": "https://roman.pt/about/", "published_at": null }, { "id": "01a087d7-806c-71a0-868e-e1caa1375fc9", "title": "AWS", "url": "https://roman.pt/snippets/aws/", "published_at": null }, { "id": "01a087d7-806c-71a0-868e-e1caa1e3d4aa", "title": "Docker and docker-compose", "url": "https://roman.pt/snippets/docker/", "published_at": null }, { "id": "01a087d7-806c-71a0-868e-e1caa2d9ccaa", "title": "External links", "url": "https://roman.pt/links/", "published_at": null }, { "id": "01a087d7-806c-71a0-868e-e1caa34f64dd", "title": "Git", "url": "https://roman.pt/snippets/git/", "published_at": null }, { "id": "01a087d7-806c-71a0-868e-e1caa3606211", "title": "Poetry", "url": "https://roman.pt/snippets/poetry/", "published_at": null }, { "id": "01a087d7-806c-71a0-868e-e1caa3d8b93c", "title": "Pydantic", "url": "https://roman.pt/snippets/pydantic/", "published_at": null }, { "id": "01a087d7-806c-71a0-868e-e1caa3ff9b60", "title": "Python project", "url": "https://roman.pt/snippets/python-project/", "published_at": null }, { "id": "01a087d7-806c-71a0-868e-e1caa4264e3a", "title": "Quote of the Day Privacy Policy", "url": "https://roman.pt/apps/qod/privacy/", "published_at": null } ] posts Claim your blog
Back to Roman Imankulov - Full-stack Python developer. Building [Smello](https://smello.io).
Blog · corpus.blog/blogs/roman.pt/posts

Roman Imankulov - Full-stack Python developer. Building [Smello](https://smello.io).

roman.pt

2026

2025

2024

2023

2022

2021

2020

Undated