René's URL Explorer Experiment


Title: Time response plots by murrayrm · Pull Request #920 · python-control/python-control · GitHub

Open Graph Title: Time response plots by murrayrm · Pull Request #920 · python-control/python-control

X Title: Time response plots by murrayrm · Pull Request #920 · python-control/python-control

Description: This PR implements time response plots for the various simulation routines in python-control via a new function time_response_plot() and via the plot() method on the TimeResponseData class. This is aligned with the new plotting paradigm in #645. Examples (from the user documentation): Input/output time responses are produced using one of several python-control functions: forced_response, impulse_response, initial_response(), input_output_response(), and step_response(). Each of these return a TimeResponseData object, which contains the time, input, state, and output vectors associated with the simulation. Time response data can be plotted with the time_response_plot() function, which is also available as the plot() method. For example, the step response for a two-input, two-output can be plotted using the commands: sys_mimo = ct.tf2ss( [[[1], [0.1]], [[0.2], [1]]], [[[1, 0.6, 1], [1, 1, 1]], [[1, 0.4, 1], [1, 2, 1]]], name="MIMO") response = step_response(sys) response.plot() which produces the following plot: The TimeResponseData object can also be used to access the data from the simulation: time, outputs, inputs = response.time, response.outputs, response.inputs fig, axs = plt.subplots(2, 2) for i in range(2): for j in range(2): axs[i, j].plot(time, outputs[i, j]) A number of options are available in the plot method to customize the appearance of input output data. For data produced by the impulse_response() and step_response() commands, the inputs are not shown. This behavior can be changed using the plot_inputs keyword. It is also possible to combine multiple lines onto a single graph, using either the overlay_signals keyword (which puts all outputs out a single graph and all inputs on a single graph) or the overlay_traces keyword, which puts different traces (e.g., corresponding to step inputs in different channels) on the same graph, with appropriate labeling via a legend on selected axes. For example, using plot_input=True and overlay_signals=True yields the following plot: ct.step_response(sys_mimo).plot( plot_inputs=True, overlay_signals=True, title="Step response for 2x2 MIMO system " + "[plot_inputs, overlay_signals]") Input/output response plots created with either the forced_response() or the input_output_response() functions include the input signals by default. These can be plotted on separate axes, but also “overlaid” on the output axes (useful when the input and output signals are being compared to each other). The following plot shows the use of plot_inputs=’overlay’ as well as the ability to reposition the legends using the legend_map keyword: timepts = np.linspace(0, 10, 100) U = np.vstack([np.sin(timepts), np.cos(2*timepts)]) ct.input_output_response(sys_mimo, timepts, U).plot( plot_inputs='overlay', legend_map=np.array([['lower right'], ['lower right']]), title="I/O response for 2x2 MIMO system " + "[plot_inputs='overlay', legend_map]") Another option that is available is to use the transpose keyword so that instead of plotting the outputs on the top and inputs on the bottom, the inputs are plotted on the left and outputs on the right, as shown in the following figure: U1 = np.vstack([np.sin(timepts), np.cos(2*timepts)]) resp1 = ct.input_output_response(sys_mimo, timepts, U1) U2 = np.vstack([np.cos(2*timepts), np.sin(timepts)]) resp2 = ct.input_output_response(sys_mimo, timepts, U2) ct.combine_traces( [resp1, resp2], trace_labels=["Scenario #1", "Scenario #2"]).plot( transpose=True, title="I/O responses for 2x2 MIMO system, multiple traces " "[transpose]") This figure also illustrates the ability to create “multi-trace” plots using the combine_traces() function. Additional customization is possible using theinput_props, output_props and trace_props keywords to set complementary line colors and styles for various signals and traces: out = ct.step_response(sys_mimo).plot( plot_inputs='overlay', overlay_signals=True, overlay_traces=True, output_props=[{'color': c} for c in ['blue', 'orange']], input_props=[{'color': c} for c in ['red', 'green']], trace_props=[{'linestyle': s} for s in ['-', '--']])

Open Graph Description: This PR implements time response plots for the various simulation routines in python-control via a new function time_response_plot() and via the plot() method on the TimeResponseData class. This i...

X Description: This PR implements time response plots for the various simulation routines in python-control via a new function time_response_plot() and via the plot() method on the TimeResponseData class. This i...

Opengraph URL: https://github.com/python-control/python-control/pull/920

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:b68f3a0d-0590-5c2a-aac4-335e47879290
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idD53A:2333C8:2CF7D62:3D1A71B:6979BF63
html-safe-nonce11c0f1d068e0196d309ac715d2bc3ac359386e157ca0f967027b5791f99af6ab
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJENTNBOjIzMzNDODoyQ0Y3RDYyOjNEMUE3MUI6Njk3OUJGNjMiLCJ2aXNpdG9yX2lkIjoiMTE3NzM2MzUzMzg5Nzc3Njk5NSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacfe448548cb9871127027f5d12ea557418d9b7a7230cbf468a1290533804f31f6
hovercard-subject-tagpull_request:1417150241
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/python-control/python-control/pull/920/files
twitter:imagehttps://avatars.githubusercontent.com/u/293362?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/293362?s=400&v=4
og:image:altThis PR implements time response plots for the various simulation routines in python-control via a new function time_response_plot() and via the plot() method on the TimeResponseData class. This i...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Nonec049b65ec7e54cbf2521f5a560b6527714c612b0bd169188e2ea6e16f83bd5f4
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/python-control/python-control git https://github.com/python-control/python-control.git
octolytics-dimension-user_id2285872
octolytics-dimension-user_loginpython-control
octolytics-dimension-repository_id22791752
octolytics-dimension-repository_nwopython-control/python-control
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id22791752
octolytics-dimension-repository_network_root_nwopython-control/python-control
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release87b137883e35e2766c3d0f6a257c4044f6390b83
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/python-control/python-control/pull/920/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython-control%2Fpython-control%2Fpull%2F920%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython-control%2Fpython-control%2Fpull%2F920%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=python-control%2Fpython-control
Reloadhttps://github.com/python-control/python-control/pull/920/files
Reloadhttps://github.com/python-control/python-control/pull/920/files
Reloadhttps://github.com/python-control/python-control/pull/920/files
python-control https://github.com/python-control
python-controlhttps://github.com/python-control/python-control
Notifications https://github.com/login?return_to=%2Fpython-control%2Fpython-control
Fork 447 https://github.com/login?return_to=%2Fpython-control%2Fpython-control
Star 2k https://github.com/login?return_to=%2Fpython-control%2Fpython-control
Code https://github.com/python-control/python-control
Issues 87 https://github.com/python-control/python-control/issues
Pull requests 8 https://github.com/python-control/python-control/pulls
Discussions https://github.com/python-control/python-control/discussions
Actions https://github.com/python-control/python-control/actions
Projects 0 https://github.com/python-control/python-control/projects
Wiki https://github.com/python-control/python-control/wiki
Security 0 https://github.com/python-control/python-control/security
Insights https://github.com/python-control/python-control/pulse
Code https://github.com/python-control/python-control
Issues https://github.com/python-control/python-control/issues
Pull requests https://github.com/python-control/python-control/pulls
Discussions https://github.com/python-control/python-control/discussions
Actions https://github.com/python-control/python-control/actions
Projects https://github.com/python-control/python-control/projects
Wiki https://github.com/python-control/python-control/wiki
Security https://github.com/python-control/python-control/security
Insights https://github.com/python-control/python-control/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fpython-control%2Fpython-control%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fpython-control%2Fpython-control%2Fissues%2Fnew%2Fchoose
murrayrmhttps://github.com/murrayrm
python-control:mainhttps://github.com/python-control/python-control/tree/main
murrayrm:time_plots-20Jun2023https://github.com/murrayrm/python-control/tree/time_plots-20Jun2023
Conversation 2 https://github.com/python-control/python-control/pull/920
Commits 12 https://github.com/python-control/python-control/pull/920/commits
Checks 0 https://github.com/python-control/python-control/pull/920/checks
Files changed https://github.com/python-control/python-control/pull/920/files
Please reload this pagehttps://github.com/python-control/python-control/pull/920/files
Time response plots https://github.com/python-control/python-control/pull/920/files#top
Show all changes 12 commits https://github.com/python-control/python-control/pull/920/files
ece5f92 initial implementation murrayrm Jun 21, 2023 https://github.com/python-control/python-control/pull/920/commits/ece5f9216f2458a92e32f7d536e55f1fef35ae25
dacf17c add support for plot_input='overlay', trace labeling, legend processing murrayrm Jun 25, 2023 https://github.com/python-control/python-control/pull/920/commits/dacf17c87e13aa2e6d33c2f9fb706215800eeb2b
9f99219 unit tests + bug fixes murrayrm Jun 28, 2023 https://github.com/python-control/python-control/pull/920/commits/9f99219726af16878f1c93c82389ac289f99fe7e
3f7e275 add user documentation (with figures) + combine_traces function murrayrm Jun 29, 2023 https://github.com/python-control/python-control/pull/920/commits/3f7e27588558a2df013e6281de7dd3991a3c3725
97f2fd1 updated unit tests (coverage) murrayrm Jun 30, 2023 https://github.com/python-control/python-control/pull/920/commits/97f2fd1366e1a5f90b9deeff3996e5fef505f621
6bb8b56 change ioresp_plot to time_response_plot murrayrm Jun 30, 2023 https://github.com/python-control/python-control/pull/920/commits/6bb8b56afefaf0bcd6f6cb51136685ddd3208f6e
29054ec customizable line properties, combine_* -> overlay_*, documentation murrayrm Jul 1, 2023 https://github.com/python-control/python-control/pull/920/commits/29054ec9bbec189b6c7078a56ff1b745a48c51b8
7f92ce0 add trace_labels option to time_response_plot() murrayrm Jul 3, 2023 https://github.com/python-control/python-control/pull/920/commits/7f92ce0f32319916fc4a8833cc0d1d0d265e8efd
1f44fd6 fix shape of output for time_reesponse_plot() murrayrm Jul 3, 2023 https://github.com/python-control/python-control/pull/920/commits/1f44fd600ac1ffd50c89eb4967488e3c08b38db9
3290809 update line properties code for Python 3.8 murrayrm Jul 3, 2023 https://github.com/python-control/python-control/pull/920/commits/3290809621d52792061ec776b28cbf9ade2ed399
1a9e64f fix processing of custom font sizes (w/ unit test) murrayrm Jul 3, 2023 https://github.com/python-control/python-control/pull/920/commits/1a9e64fc4ea3ace4b20f7121fd95e449ab197c34
bab5071 rename combine_traces to combine_time_responses, updated trace labels murrayrm Jul 4, 2023 https://github.com/python-control/python-control/pull/920/commits/bab5071da0292f3ba8860b3a0fdc05c8cd9661ba
Clear filters https://github.com/python-control/python-control/pull/920/files
Please reload this pagehttps://github.com/python-control/python-control/pull/920/files
Please reload this pagehttps://github.com/python-control/python-control/pull/920/files
__init__.py https://github.com/python-control/python-control/pull/920/files#diff-a082bea4cb97f2978eb7abd1de48ecde6447923e60eb55409a243b98e1072fa3
config.py https://github.com/python-control/python-control/pull/920/files#diff-d1ad1d32d49067e21beadf8da713ffdea3d1673aedb13dbbf54028cb7e8e4cb5
nlsys.py https://github.com/python-control/python-control/pull/920/files#diff-5ae9b973ef43076c51927f314e400ffc76cef00009ba1f343c83c53bd12a9d99
kwargs_test.py https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
timeplot_test.py https://github.com/python-control/python-control/pull/920/files#diff-6a65c7ec317ec72929a098855d7d948c942c726aa0907890b0a02ea124869c0f
timeplot.py https://github.com/python-control/python-control/pull/920/files#diff-6208d7a27459381a4957ba5445cd6e98154209ecde7cb2271bc40f7b7b99b931
timeresp.py https://github.com/python-control/python-control/pull/920/files#diff-3200453f1cf62f183f04dbf39d1129d91245c53a9f74675cee6bd384351c45b4
Makefile https://github.com/python-control/python-control/pull/920/files#diff-f48ddfd1eec38c4d39f84e195259371f8397cd30146f46b113bdcb4590ed262c
index.rst https://github.com/python-control/python-control/pull/920/files#diff-3161f66a61b9ed68303607f1dbdce1c7bdcc69c42f8ea1c2051a07a579ebcf5d
plotting.rst https://github.com/python-control/python-control/pull/920/files#diff-7d87c42933f69063b454fa6021951255b0061c5f7c39c347e2d0887078dc9c2a
timeplot-mimo_ioresp-mt_tr.png https://github.com/python-control/python-control/pull/920/files#diff-1f8beff0b944a38197e9b9f27cd78482bc93b30ee50d0c6f4380d09203bb2eb4
timeplot-mimo_ioresp-ov_lm.png https://github.com/python-control/python-control/pull/920/files#diff-d917f31ce1f1872dbdea348c6fbc1cec784f2cd44528fe8b3c29c94bf84c735c
timeplot-mimo_step-default.png https://github.com/python-control/python-control/pull/920/files#diff-310ede4638e52ba6a553d5295536f35b164ef67bdf4a13c0a030028552ffd8e1
timeplot-mimo_step-linestyle.png https://github.com/python-control/python-control/pull/920/files#diff-904c091c557448272184c24df2414a59df21d90e44bc33bd5f99ce3ef8aca5de
timeplot-mimo_step-pi_cs.png https://github.com/python-control/python-control/pull/920/files#diff-f4bbc2e02a764c474e888fb720d932130b9683457c4f9f2477a94a0324bf01fd
control/__init__.pyhttps://github.com/python-control/python-control/pull/920/files#diff-a082bea4cb97f2978eb7abd1de48ecde6447923e60eb55409a243b98e1072fa3
View file https://github.com/murrayrm/python-control/blob/bab5071da0292f3ba8860b3a0fdc05c8cd9661ba/control/__init__.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python-control/python-control/pull/920/{{ revealButtonHref }}
https://github.com/python-control/python-control/pull/920/files#diff-a082bea4cb97f2978eb7abd1de48ecde6447923e60eb55409a243b98e1072fa3
https://github.com/python-control/python-control/pull/920/files#diff-a082bea4cb97f2978eb7abd1de48ecde6447923e60eb55409a243b98e1072fa3
https://github.com/python-control/python-control/pull/920/files#diff-a082bea4cb97f2978eb7abd1de48ecde6447923e60eb55409a243b98e1072fa3
control/config.pyhttps://github.com/python-control/python-control/pull/920/files#diff-d1ad1d32d49067e21beadf8da713ffdea3d1673aedb13dbbf54028cb7e8e4cb5
View file https://github.com/murrayrm/python-control/blob/bab5071da0292f3ba8860b3a0fdc05c8cd9661ba/control/config.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python-control/python-control/pull/920/{{ revealButtonHref }}
https://github.com/python-control/python-control/pull/920/files#diff-d1ad1d32d49067e21beadf8da713ffdea3d1673aedb13dbbf54028cb7e8e4cb5
https://github.com/python-control/python-control/pull/920/files#diff-d1ad1d32d49067e21beadf8da713ffdea3d1673aedb13dbbf54028cb7e8e4cb5
control/nlsys.pyhttps://github.com/python-control/python-control/pull/920/files#diff-5ae9b973ef43076c51927f314e400ffc76cef00009ba1f343c83c53bd12a9d99
View file https://github.com/murrayrm/python-control/blob/bab5071da0292f3ba8860b3a0fdc05c8cd9661ba/control/nlsys.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python-control/python-control/pull/920/{{ revealButtonHref }}
https://github.com/python-control/python-control/pull/920/files#diff-5ae9b973ef43076c51927f314e400ffc76cef00009ba1f343c83c53bd12a9d99
https://github.com/python-control/python-control/pull/920/files#diff-5ae9b973ef43076c51927f314e400ffc76cef00009ba1f343c83c53bd12a9d99
https://github.com/python-control/python-control/pull/920/files#diff-5ae9b973ef43076c51927f314e400ffc76cef00009ba1f343c83c53bd12a9d99
https://github.com/python-control/python-control/pull/920/files#diff-5ae9b973ef43076c51927f314e400ffc76cef00009ba1f343c83c53bd12a9d99
control/tests/kwargs_test.pyhttps://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
View file https://github.com/murrayrm/python-control/blob/bab5071da0292f3ba8860b3a0fdc05c8cd9661ba/control/tests/kwargs_test.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python-control/python-control/pull/920/{{ revealButtonHref }}
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
https://github.com/python-control/python-control/pull/920/files#diff-3144c3ea9a838756fe63a094bb84c293d32c5190d9b081cbb2f10926fda2e19e
Please reload this pagehttps://github.com/python-control/python-control/pull/920/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.