{"id":19485593,"url":"https://github.com/pyozer/introduction_screen","last_synced_at":"2025-05-14T08:06:40.919Z","repository":{"id":40302524,"uuid":"144338795","full_name":"Pyozer/introduction_screen","owner":"Pyozer","description":"Add easily to your app an introduction screen to provide informations to new users","archived":false,"fork":false,"pushed_at":"2025-02-18T22:34:06.000Z","size":31797,"stargazers_count":669,"open_issues_count":15,"forks_count":232,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-05-14T08:06:33.988Z","etag":null,"topics":["android","dart","dart2","flutter","introduction","ios","ui"],"latest_commit_sha":null,"homepage":"https://pub.dartlang.org/packages/introduction_screen","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Pyozer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2018-08-10T22:50:30.000Z","updated_at":"2025-05-11T21:40:58.000Z","dependencies_parsed_at":"2024-06-18T13:58:47.724Z","dependency_job_id":"d51ed96b-f6cb-4ec8-b3eb-f5349c3ae4cb","html_url":"https://github.com/Pyozer/introduction_screen","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pyozer%2Fintroduction_screen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pyozer%2Fintroduction_screen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pyozer%2Fintroduction_screen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pyozer%2Fintroduction_screen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Pyozer","download_url":"https://codeload.github.com/Pyozer/introduction_screen/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254101618,"owners_count":22014909,"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":["android","dart","dart2","flutter","introduction","ios","ui"],"created_at":"2024-11-10T20:28:49.831Z","updated_at":"2025-05-14T08:06:35.896Z","avatar_url":"https://github.com/Pyozer.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IntroductionScreen [![pub package](https://img.shields.io/pub/v/introduction_screen.svg)](https://pub.dartlang.org/packages/introduction_screen)\n\n[![Build Example App](https://github.com/Pyozer/introduction_screen/actions/workflows/example_app.yml/badge.svg)](https://github.com/Pyozer/introduction_screen/actions/workflows/example_app.yml)\n[![Run Project Tests](https://github.com/Pyozer/introduction_screen/actions/workflows/main.yml/badge.svg)](https://github.com/Pyozer/introduction_screen/actions/workflows/main.yml)\n\n\nIntroduction Screen allows you to have a screen on an app's first launch to, for example, explain your app.\nThis widget is very customizable with a great design.\n\n`introduction_screen` uses another package, [dots_indicator](https://github.com/Pyozer/dots_indicator), that I also created.\n\n\u003cimg src=\"https://raw.githubusercontent.com/Pyozer/introduction_screen/master/demo/example.gif\" width=\"270\"\u003e\n\n## Installation\n\nYou just need to add `introduction_screen` as a [dependency in your pubspec.yaml file](https://flutter.io/using-packages/).\n\n```yaml\ndependencies:\n  introduction_screen: ^3.1.17\n```\n\n## Examples\n\nNot all of the many parameters in each class are used in these examples.\nSee [Parameter Lists](#parameter-lists) for the complete documentation for each class.\n\n*Note: if you want to display `IntroductionScreen` only once, like on the first start of your app, use\n[shared_preferences](https://pub.dev/packages/shared_preferences) (or a similar strategy)\nto save the status of whether it has been already displayed or not.\nIt's not responsibility of this package to handle this.*\n\n### PageViewModel\n\nA list of `PageViewModel`s is used for `IntroductionScreen`'s `pages` parameter.\n\n#### Simple page\n\nThis example only defines the `title`, `body`, and `image` parameters.\n(You can define `image` as any widget.)\n\n```dart\nPageViewModel(\n  title: \"Title of introduction page\",\n  body: \"Welcome to the app! This is a description of how it works.\",\n  image: const Center(\n    child: Icon(Icons.waving_hand, size: 50.0),\n  ),\n)\n```\n\n#### Page with custom colors\n\nThis example defines the color of the page using the `decoration` parameter.\nThe image link does not exist and is only for example.\n\n```dart\nPageViewModel(\n  title: \"Title of blue page\",\n  body: \"Welcome to the app! This is a description on a page with a blue background.\",\n  image: Center(\n    child: Image.network(\"https://example.com/image.png\", height: 175.0),\n  ),\n  decoration: const PageDecoration(\n    pageColor: Colors.blue,\n  ),\n)\n```\n\n#### Page with custom text style\n\nThis example defines custom TextStyles in the `decoration` parameter for the title and body.\n\n```dart\nPageViewModel(\n  title: \"Title of orange text and bold page\",\n  body: \"This is a description on a page with an orange title and bold, big body.\",\n  image: const Center(\n    child: Text(\"👋\", style: TextStyle(fontSize: 100.0)),\n  ),\n  decoration: const PageDecoration(\n    titleTextStyle: TextStyle(color: Colors.orange),\n    bodyTextStyle: TextStyle(fontWeight: FontWeight.w700, fontSize: 20.0),\n  ),\n)\n```\n\n#### Page with a footer (button)\n\nThis example defines a `footer` for the page with a button.\nThe image does not exist and is only for example.\n\n```dart\nPageViewModel(\n  title: \"Title of custom button page\",\n  body: \"This is a description on a page with a custom button below.\",\n  image: Image.asset(\"res/images/logo.png\", height: 175.0),\n  footer: ElevatedButton(\n    onPressed: () {\n      // On button pressed\n    },\n    child: const Text(\"Let's Go!\"),\n  ),\n)\n```\n\n#### Page with widget body\n\nThis example defines the page body using `bodyWidget` and a Widget, rather than with `body` and a String.\nOnly use `body` **or** `bodyWidget`.\nThe `titleWidget` parameter does the same thing for the title.\n\n```dart\nPageViewModel(\n  title: \"Title of custom body page\",\n  bodyWidget: Row(\n    mainAxisAlignment: MainAxisAlignment.center,\n    children: const [\n      Text(\"Click on \"),\n      Icon(Icons.edit),\n      Text(\" to edit a post\"),\n    ],\n  ),\n  image: const Center(child: Icon(Icons.android)),\n)\n```\n\n### IntroductionScreen\n\nThe `IntroductionScreen` Widget is the single object that holds all `pages` and related navigation and settings.\nIn these examples, `listPagesViewModel` is a **list of pages**.\nA page is a `PageViewModel` object, like the examples in the previous section.\n\n**Note:**\n\n* If you not provide the `next` parameter, the \"Next\" button will be not displayed. The parameter `showNextButton` must then be set to `false`.\n* If you want to display the \"Skip\" button, you must add a `skip` parameter **and** set `showSkipButton` to `true`.\n* The `done` parameter is only required if `showDoneButton` is `true`.\n\n#### Simple intro screen\n\nThis example only defines the `pages`, `showNextButton`, `done`, and `onDone` parameters.\n\n```dart\nIntroductionScreen(\n  pages: listPagesViewModel,\n  showNextButton: false,\n  done: const Text(\"Done\"),\n  onDone: () {\n    // On button pressed\n  },\n)\n```\n\n#### Intro screen with skip button\n\nThis example defines `showSkipButton` and `skip` to show the \"Skip\" button on all pages *except the last one*.\n\n```dart\nIntroductionScreen(\n  pages: listPagesViewModel,\n  showSkipButton: true,\n  showNextButton: false,\n  skip: const Text(\"Skip\"),\n  done: const Text(\"Done\"),\n  onDone: () {\n    // On button pressed\n  },\n)\n```\n\n#### Intro screen with back button\n\nThis example defines `showBackButton` and `back` to show the \"Back\" button on all pages *except the first one*.\n\n```dart\nIntroductionScreen(\n  pages: listPagesViewModel,\n  showBackButton: true,\n  showNextButton: false,\n  back: const Icon(Icons.arrow_back),\n  done: const Text(\"Done\"),\n  onDone: () {\n    // On button pressed\n  },\n)\n```\n\n#### Intro screen with custom button text and dots indicators\n\nThis example defines `dotsDecorator` to show a custom implementation of the page progress dots.\nThis example also uses a custom style for the \"Done\" button, bolding it.\n\n```dart\nIntroductionScreen(\n  pages: listPagesViewModel,\n  showSkipButton: true,\n  skip: const Icon(Icons.skip_next),\n  next: const Text(\"Next\"),\n  done: const Text(\"Done\", style: TextStyle(fontWeight: FontWeight.w700)),\n  onDone: () {\n    // On Done button pressed\n  },\n  onSkip: () {\n    // On Skip button pressed\n  },\n  dotsDecorator: DotsDecorator(\n    size: const Size.square(10.0),\n    activeSize: const Size(20.0, 10.0),\n    activeColor: Theme.of(context).colorScheme.secondary,\n    color: Colors.black26,\n    spacing: const EdgeInsets.symmetric(horizontal: 3.0),\n    activeShape: RoundedRectangleBorder(\n        borderRadius: BorderRadius.circular(25.0)\n    ),\n  ),\n)\n```\n\n#### Intro screen with custom button style\n\nA custom style will be applied to all buttons using the `baseBtnStyle` parameter (\"Back\", \"Skip\", \"Next\", \"Done\").\nSpecific button style parameters may also be used: `backStyle`, `skipStyle`, `nextStyle`, `doneStyle`.\n\nIf both `baseBtnStyle` and a specific button style are defined, the `baseBtnStyle` will be merge with specific style.\n\nThe following is the default button style:\n\n```dart\nTextButton.styleFrom(\n  shape: RoundedRectangleBorder(\n    borderRadius: BorderRadius.circular(8.0),\n  ),\n)\n```\n\nThis example will override the default in the following ways:\n\n- All buttons have a light grey background\n- The \"Skip\" button is red\n- The \"Done\" button is green\n- The \"Next\" button is blue\n\n```dart\nIntroductionScreen(\n  pages: listPagesViewModel,\n  showSkipButton: true,\n  skip: const Text(\"Skip\"),\n  next: const Text(\"Next\"),\n  done: const Text(\"Done\"),\n  onDone: () {\n    // When done button is press\n  },\n  baseBtnStyle: TextButton.styleFrom(\n    backgroundColor: Colors.grey.shade200,\n  ),  \n  skipStyle: TextButton.styleFrom(primary: Colors.red),  \n  doneStyle: TextButton.styleFrom(primary: Colors.green),  \n  nextStyle: TextButton.styleFrom(primary: Colors.blue),\n)\n```\n\n#### Intro screen with `key` param to change page manually\n\nTo change page manually / programatically, in response to user input or another event:\n\n1. Define a `GlobalKey` as part of the parent widget's state\n1. Pass that key to the `IntroductionScreen` `key` param\n1. Use the `currentState` member to access functions defined in `IntroductionScreenState` e.g.\n    1. `next()`\n    1. `previous()`\n    1. `skipToEnd()`\n    1. `animateScroll()`\n\nThis example moves to the next page after a delay:\n\n```dart\nclass IntroScreenDemo extends StatefulWidget {\n  @override\n  State\u003cIntroScreenDemo\u003e createState() =\u003e _IntroScreenDemoState();\n}\n\nclass _IntroScreenDemoState extends State\u003cIntroScreenDemo\u003e {\n  // 1. Define a `GlobalKey` as part of the parent widget's state\n  final _introKey = GlobalKey\u003cIntroductionScreenState\u003e();\n  String _status = 'Waiting...';\n\n  @override\n  Widget build(BuildContext context) {\n    return IntroductionScreen(\n      // 2. Pass that key to the `IntroductionScreen` `key` param\n      key: _introKey,\n      pages: [\n        PageViewModel(\n            title: 'Page One',\n            bodyWidget: Column(\n              children: [\n                Text(_status),\n                ElevatedButton(\n                    onPressed: () {\n                      setState(() =\u003e _status = 'Going to the next page...');\n\n                      // 3. Use the `currentState` member to access functions defined in `IntroductionScreenState`\n                      Future.delayed(const Duration(seconds: 3),\n                          () =\u003e _introKey.currentState?.next());\n                    },\n                    child: const Text('Start'))\n              ],\n            )),\n        PageViewModel(\n            title: 'Page Two', bodyWidget: const Text('That\\'s all folks'))\n      ],\n      showNextButton: false,\n      showDoneButton: false,\n    );\n  }\n}\n```\n\n## Parameter Lists\n\n### IntroductionScreen parameters\n\nMany parameters can be used to customize your app introduction like you want!\nThis is the full list:\n\n#### Pages\n\n- Page that will be display (`PageViewModel`), by adding `pages: [..]` parameter.\n- Use your own pages (Widget) without using those predefined, by adding `rawPages: [..]` parameter.\n  - If you provide both `rawPages` and `pages` parameter, `pages` will be used.\n\n#### Callbacks\n\n- Set a custom callback when done button is pressed, by adding `onDone: () {}` parameter.\n  - This param is required if you define `done` param, EXCEPT if you set `showDoneButton: false`\n  - If you set `overrideDone` param, it will be ignored.\n- Set a custom callback when skip button is pressed, by adding `onSkip: () {}` parameter.\n  - By default, it will go to the last page\n  - If you set `overrideSkip` param, it will be ignored.\n- Add callback to listen page changes, by adding `onChange: (page) {}` parameter.\n\n#### Use pre-made buttons\n\n- Define pre-made Done button child (Widget), by adding `done: Text('Done')`\n  - This param or `overrideDone` are required, EXCEPT if you set `showDoneButton: false`\n  - By providing `done`, the parameter `onDone` is also required.\n- Define pre-made Next button child (Widget), by adding `next: Text('Next')`\n  - This param is required, EXCEPT if you set `showNextButton: false`\n- Define pre-made Skip button child (Widget), by adding `skip: Text('Skip')`\n  - This param is required if you set `showSkipButton: true`\n  Define pre-made Back button child (Widget), by adding `back: Text('Back')`\n  - This param is required if you set `showBackButton: true`\n\n#### Use custom buttons\n\n*If you want to control pages, you can use `key` param. Search this repo's Issues for more detailed information.* \n\n- Define your custom Done button (Widget), by using `overrideDone`\n  - This param or `done` are required, EXCEPT if you set `showDoneButton: false`\n  - This parameter has priority over the `done` parameter.\n- Define your custom Next button (Widget), by using `overrideNext`\n  - This param or `next` are required, EXCEPT if you set `showNextButton: false`\n  - This parameter has priority over the `next` parameter.\n- Define your custom Skip button (Widget), by using `overrideSkip`\n  - This param or `skip` are required if you set `showSkipButton: true`\n  - This parameter has priority over the `skip` parameter.\n- Define your custom Back button (Widget), by using `overrideBack`\n  - This param or `back` are required if you set `showBackButton: true`\n  - This parameter has priority over the `skip` parameter.\n- Define your custom dots widget (or the widget that you want on that position), by using `customProgress`\n\n#### Manage display of pre-made or custom buttons\n\n- Hide/show Skip button, by adding `showSkipButton: false` parameter.\n  - Default `false`\n- Hide/show Next button, by adding `showNextButton: false` parameter.\n  - Default `true`\n- Hide/show Done button, by adding `showDoneButton: false` parameter.\n  - Default `true`\n- Hide/show Back button, by adding `showBackButton: false` parameter.\n  - Default `false`\n\n#### Controls\n\n- Display or not the progress dots, by adding `isProgress: false` parameter.\n  - Default `true`\n- Enable or disable dots progress tap, by adding `isProgressTap: false` parameter.\n  - Default `true`\n\n#### Page\n\n- Freeze the scroll, by adding `freeze: true` parameter.\n  - Default `false`\n- Duration of scrolling animation, by adding `animationDuration: 400` parameter.\n  - Default `350`\n- Initial page, by adding `initialPage: 2` parameter.\n  - Default `0`\n- You can provide a ScrollController for each page by adding `scrollControllers: [..]` parameter.\n  - If you have 5 pages, you can provide 5 differents ScrollController.\n  - If you want to have only one ScrollController for page **1**, you can provide: `scrollControllers: [controller1]`\n  - If you want to have only one ScrollController for page **3**, you can provide: `scrollControllers: [null, null, controller1]`\n  - Will be ignored for page(s) if `useScrollView` is set to `false` in PageViewModel(s)\n\n#### Pages style\n\n- Global background color, by adding `globalBackgroundColor: Colors.blue` parameter.\n  - Tips: use `Colors.transparent` to display an image as background (using Stack with IntroductionScreen inside for example)\n- Customize dots (progression) by adding `dotsDecorator: DotsDecorator(...)`\n  - You can customize dots size, shape, colors, spacing.\n- Customize dots container by adding `dotsContainerDecorator: BoxDecorator(...)`\n  - You can customize container that contain controls.\n- Skip/Back button flex, by adding `skipOrBackFlex: 1` parameter.\n  - Set 0 to disable Expanded behaviour, default `1`\n- Dots indicator flex, by adding `dotsFlex: 1` parameter.\n  - Set 0 to disable Expanded behaviour, default `1`\n- Next/Done button flex, by adding `nextFlex: 1` parameter.\n  - Set 0 to disable Expanded behaviour, default `1`\n- Animation curve between pages, by adding `curve: Curves.elasticIn` parameter.\n  - Default `Curves.easeIn`\n\n#### Buttons style\n\n- Change global style of buttons (for skip, next, done, back), by adding `baseBtnStyle` parameter.\n- Change skip button style, by adding `skipStyle: TextButton.styleFrom(alignment: Alignment.centerLeft)` parameter.\n- Change next button style, by adding `nextStyle: TextButton.styleFrom(alignment: Alignment.centerRight)` parameter.\n- Change done button style, by adding `doneStyle: TextButton.styleFrom(splashFactory: NoSplash.splashFactory)` parameter.\n- Change back button style, by adding `backStyle: TextButton.styleFrom(primary: Colors.red)` parameter.\n\n#### Semantic\n\n- Change skip button semantic label, by adding `skipSemantic: 'Skip introduction'` parameter.\n- Change next button semantic label, by adding `nextSemantic: 'Go to next page'` parameter.\n- Change done button semantic label, by adding `doneSemantic: 'Exit introduction'` parameter.\n- Change back button semantic label, by adding `backSemantic: 'Go to previous page'` parameter.\n\n#### Layout\n\n- Show the bottom part of the page, that include skip, next, done buttons by setting `showBottomPart: true` parameter.\n- Hide the bottom part of the page when the keyboard is open with `hideBottomOnKeyboard` parameter.\n- Customize controls position on screen, by adding `controlsPosition: const Position(left: 0, right: 0, bottom: 100)` parameter.\n  - Default `const Position(left: 0, right: 0, bottom: 0)`\n- Customize margin of controls's container, by adding `controlsMargin: EdgeInsets.all(16.0)` parameter.\n  - Default `EdgeInsets.zero`\n- Customize padding of controls's container, by adding `controlsPadding: EdgeInsets.all(8.0)` parameter.\n  - Default `EdgeInsets.all(16.0)`\n- Add global header (top), static and displayed above pages, by adding `globalHeader: Image.asset(...)` parameter.\n- Add global footer below controls/dots, by adding `globalFooter: ElevatedButton(...)` parameter.\n- Change axis of scroll by adding `pagesAxis: Axis.vertical`.\n  - Default `Axis.horizontal`\n- Change default scroll physics of PageView by adding `scrollPhysics: ClampingScrollPhysics()`.\n  - Default `BouncingScrollPhysics()`\n- You can also enable right-to-left behavior by adding `rtl: true`.\n  - Default `false`\n- Change default implicit scrolling behavior by adding `allowImplicitScrolling: true`\n  - Default `false`\n  - Reference: [PageView's `allowImplicitScrolling` parameter](https://api.flutter.dev/flutter/widgets/PageView/PageView.html)\n- Activate the SafeArea by setting `safeAreaList: [true,true,true,true]` parameter.\n\n### PageViewModel parameters\n\nYou can provide many parameters to customize each pages:\n\n- `title: \"Title of the page\"` or `titleWidget: Text(\"Custom widget for title\")`\n- `body: \"Body of the page\"` or `bodyWidget: Text(\"Custom widget for body\")`\n- `image: Image.asset(...)` image of the page.\n  - It's expecting a Widget, so if you want to pass a Video, Text, or anything else, you can.\n- `backgroundImage: 'assets/fullscreen.jpg'` background image of the page (optional).\n  - It's expecting a String with a path to an image asset. Works just like the `image` parameter under the hood while making an asset span all over the screen.\n  - Doesn't affect the `image` nor `fullscreen` parameters: can be used together with them to build more complex layouts.\n- `footer: ElevatedButton(...)`, display a widget below body\n  - Like image param, it's expecting a Widget, you can pass what you want.\n- `decoration: PageDecoration(...)`, page decoration to customize page\n  - See next section for all parameters you can pass\n- `reverse: true`, reverse order of image and content (title/body). (Default: `false`)\n- `useScrollView: false`, by default pages use a Scrollview to handle small screen or long body text. You can remove ScrollView by setting to false.\n- `scrollViewKeyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.manual`, by default the keyboard dismiss behavious is manual, you can change it.\n  - Only used if useScrollView not set to false.\n\n### PageDecoration parameters\n\n- `pageColor: Colors.white`, background color of the page\n  - You cannot use both pageColor and boxDecoration params\n- `titleTextStyle: TextStyle(...)`, TextStyle of the title\n- `bodyTextStyle: TextStyle(...)`, TextStyle of the body\n- `boxDecoration: BoxDecoration(...)`, BoxDecoration of page container\n  - You cannot use both pageColor and boxDecoration params\n- `imageFlex: 2`, flex ratio of the image\n- `bodyFlex: 3`, flex ratio of the content (title/body)\n- `footerFlex: 1`, flex ratio of the content (title/body)\n- `footerFit: FlexFit.loose`, flex ratio of the content (title/body)\n- `imagePadding: EdgeInsets.only(bottom: 12.0)`, padding of the image Widget. (Default `EdgeInsets.only(bottom: 24.0)`)\n- `contentPadding: EdgeInsets.only(all: 24.0)`, padding of the content (title/body/footer) Widget. (Default `EdgeInsets.all(16)`)\n- `titlePadding: EdgeInsets.only(bottom: 24.0)`, padding of the title text/Widget. (Default `EdgeInsets.only(top: 16.0, bottom: 24.0)`)\n- `descriptionPadding: EdgeInsets.only(bottom: 24.0)`, padding of the body text/Widget. (Default `EdgeInsets.zero`)\n- `footerPadding: EdgeInsets.only(top: 24.0)`, padding of the footer text/Widget. (Default `EdgeInsets.symmetric(vertical: 24.0)`)\n- `bodyAlignment: Align.center`, content (title, body, footer) alignment. (Default `Align.topCenter`)\n- `imageAlignment: Align.center`, image alignment. (Default `Align.bottomCenter`)\n- `fullScreen: true`, Set image as fullscreen (background). (Default `false`)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyozer%2Fintroduction_screen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpyozer%2Fintroduction_screen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyozer%2Fintroduction_screen/lists"}