Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 111 additions & 38 deletions README.md
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,124 @@
# python_ireland_talk_database
An application capable of creating a historical database for all Python Ireland talks. PyCon Ireland, Limerick and monthly meetups.

# Python Ireland talks database:
A modern “intelligence platform” for Python Ireland—aggregating all past talk and event metadata into a searchable, taggable, and analyzable system.

## Project ideas:
1. Create a searchable database of past Meetups.
2. Create a searchable database of all PyCon talks & videos.
3. Create a web application to display Meetup & PyCon meta data
---

## Introduction:
For Python Ireland, we would like to create a historical database of each of the presentations given, at both our monthly meetups and PyCon Ireland and Limerick conferences.
This data can then be used to help us make informed decisions about upcoming events, for example:
## 🎯 Vision & Phases

### Meetups:
1. If we can find a venue who used to host us in the past - we can reach out and ask them to host us again.
2. If we have had speakers for a given topic we would like to reach out to.
3. See when was the last time we presented a given topic - when was the last "Python for beginners" type talk given?
We’re building the first part in three iterative phases, with room to grow into a fuller information portal:

### PyCons:
1. See all talks by a given speaker.
2. See all talks for a given subject.
3. Decide to we have enough scope to split rooms into dedicated tracks, data science, AI, web dev, etc.
### Phase A: Talk Content Explorer

## Application structure:
This will be discussed and agred with the Python Ireland development team and updated. A suggested structure is: https://github.com/cookiecutter-flask/cookiecutter-flask
- **Goal:** Ingest Meetup & Sessionize data into Elasticsearch + Postgres, and build a React/Vite front‑end “Explorer”:
- Filter by date, platform, full‑text search of titles & descriptions
- Inline tagging of individual items
- Detail drawer for full metadata (speakers, links, etc.)

The required application will need to be capable of 3 things:
1. Scraping the Meetup API.
2. Scraping PyCon Ireland data (Sessionize API?, Sessionize csv file?).
3. Presenting the data in an easily digestible format.
### Phase B: Taxonomy Manager

For the above application we will use a templated web application (Flask or other framework) to house the main application #3, above. For items #1 and #2, above we will store the code in a relevant class object that can be called, standalone, from their own main.py type file.
- **Goal:** Curate the raw tags into a structured hierarchy:
- Tag list with parent/child relationships
- Drag‑and‑drop tree builder
- Tag metadata (colors, descriptions, aliases)
- Saved tag sets for quick filtering

An example
### Phase C: Analytics Dashboard

## Technology Stack:
This will be discussed and agred with the Python Ireland development team and updated. A suggested stack is:
- **Goal:** Slice & dice tagged content with charts and exports:
- Tag distribution bar charts
- Trends over time (multi‑line charts)
- Co‑occurrence heatmaps
- CSV/JSON export and alerts on tag‑volume changes

1. Flask / FastAPI
2. React JS frontend
3. SQLAlchemy ORM
4. SQLite DB
5. Python typing
6. pytest
7. pylint
8. GitHub Actions
_Long‑term_, incorporate video data, extend this or add apps to integrate member/sponsor/speaker data (CRM) data, build a Q&A interface (with LLMs), and eventually package this as a drop‑in portal for other Python communities. Also could build a data lake to take full ownership of content, fly to the moon, etc.

## Project development constraints:
In order to proceed with the collaborative development, on GitHub, the app structure must be completed first. A suggestion would be to create a fresh cookiecutter-flask instance, and begin from there.
Once the app structure is in place, 2 files can be created, meetup_scraper.py and py_con_scraper.py, which will allow parallel development on the 3 main project tracks.
---

## 🛠 Technology Stack

### Backend (Under Construction)

- **Framework:** FastAPI
- **Primary Store:** PostgreSQL (JSONB)
- **Search & Analytics:** Elasticsearch
- **ORM & Migrations:** SQLAlchemy + Alembic
- **Auth:** OAuth2 / JWT

### Frontend

- **Build Tool:** Vite v6.3.5
- **Library:** React v19.1.0 + TypeScript v5.8.3
- **UI Components:** MUI v7.1.1 (`@mui/material`, `@mui/lab`, `@mui/icons-material`)
- **Data Grid & Pickers:** `@mui/x-data-grid` v8.5.1, `@mui/x-date-pickers` v8.5.1
- **Styling:** Emotion v11.14.0
- **Charts:** Recharts v2.15.3
- **Routing:** React Router v7.6.2
- **Elasticsearch Client:** `@elastic/elasticsearch` (latest)
- **Dates:** date-fns v4.1.0

---

## 📦 Frontend: Install & Run

1. **Ensure Node 20+**:

```bash
node --version # should be 20.x

```

2. **Install dependencies**:

```bash
cd frontend
npm install
```

3. **Configure backend URL** (optional, defaults to http://localhost:8000):
Create a .env:
`bash
echo "VITE_BACKEND_URL=http://localhost:8000" > .env
`
4. **Run the development server**:
```bash
npm run dev
```
Open http://localhost:5173/explorer to see the skeleton Explorer page.

## 🚧 Backend: Under Construction

We’ll soon add:

API endpoints in FastAPI for /explorer, /tags, /explorer/{id}, etc.

Ingestion jobs to pull Meetup.com and Sessionize data into Postgres + Elasticsearch.

# Architecture

```mermaid
flowchart LR
A["Ingest jobs<br/>(Meetup, Sessionize)"]
B["Data lake<br/>(Postgres, ES)"]
C["API layer<br/>(FastAPI REST/GraphQL)"]
D["Frontend<br/>(React + Vite)"]

A --> B --> C --> D

%% future work
subgraph Future
direction LR
E["Embeddings<br/>Vector DB (Pinecone or ES)"]
F["Q&A Service"]
E --> F
end

%% link present to future
B --> E


```

### LLM Integration (Future)

- **Goal:** Use LLMs to answer questions about the data, generate summaries, and provide insights.
2 changes: 0 additions & 2 deletions frontend/.dockerignore

This file was deleted.

1 change: 0 additions & 1 deletion frontend/.env.development_example

This file was deleted.

51 changes: 0 additions & 51 deletions frontend/.eslintrc.js

This file was deleted.

24 changes: 24 additions & 0 deletions frontend/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
5 changes: 0 additions & 5 deletions frontend/.prettierrc.js

This file was deleted.

18 changes: 0 additions & 18 deletions frontend/Dockerfile

This file was deleted.

122 changes: 54 additions & 68 deletions frontend/README.md
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Available Scripts

In the project directory, you can run:

### `npm start`

Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.

The page will reload if you make edits.<br />
You will also see any lint errors in the console.

### `npm test`

Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.

### `npm run build`

Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

### `npm run eject`

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

### Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

### Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

### Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

### Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

### `npm run build` fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default tseslint.config({
extends: [
// Remove ...tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
})
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
plugins: {
// Add the react-x and react-dom plugins
'react-x': reactX,
'react-dom': reactDom,
},
rules: {
// other rules...
// Enable its recommended typescript rules
...reactX.configs['recommended-typescript'].rules,
...reactDom.configs.recommended.rules,
},
})
```
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 111 additions & 38 deletions README.md
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,124 @@
# python_ireland_talk_database
An application capable of creating a historical database for all Python Ireland talks. PyCon Ireland, Limerick and monthly meetups.

# Python Ireland talks database:
A modern “intelligence platform” for Python Ireland—aggregating all past talk and event metadata into a searchable, taggable, and analyzable system.

## Project ideas:
1. Create a searchable database of past Meetups.
2. Create a searchable database of all PyCon talks & videos.
3. Create a web application to display Meetup & PyCon meta data
---

## Introduction:
For Python Ireland, we would like to create a historical database of each of the presentations given, at both our monthly meetups and PyCon Ireland and Limerick conferences.
This data can then be used to help us make informed decisions about upcoming events, for example:
## 🎯 Vision & Phases

### Meetups:
1. If we can find a venue who used to host us in the past - we can reach out and ask them to host us again.
2. If we have had speakers for a given topic we would like to reach out to.
3. See when was the last time we presented a given topic - when was the last "Python for beginners" type talk given?
We’re building the first part in three iterative phases, with room to grow into a fuller information portal:

### PyCons:
1. See all talks by a given speaker.
2. See all talks for a given subject.
3. Decide to we have enough scope to split rooms into dedicated tracks, data science, AI, web dev, etc.
### Phase A: Talk Content Explorer

## Application structure:
This will be discussed and agred with the Python Ireland development team and updated. A suggested structure is: https://github.com/cookiecutter-flask/cookiecutter-flask
- **Goal:** Ingest Meetup & Sessionize data into Elasticsearch + Postgres, and build a React/Vite front‑end “Explorer”:
- Filter by date, platform, full‑text search of titles & descriptions
- Inline tagging of individual items
- Detail drawer for full metadata (speakers, links, etc.)

The required application will need to be capable of 3 things:
1. Scraping the Meetup API.
2. Scraping PyCon Ireland data (Sessionize API?, Sessionize csv file?).
3. Presenting the data in an easily digestible format.
### Phase B: Taxonomy Manager

For the above application we will use a templated web application (Flask or other framework) to house the main application #3, above. For items #1 and #2, above we will store the code in a relevant class object that can be called, standalone, from their own main.py type file.
- **Goal:** Curate the raw tags into a structured hierarchy:
- Tag list with parent/child relationships
- Drag‑and‑drop tree builder
- Tag metadata (colors, descriptions, aliases)
- Saved tag sets for quick filtering

An example
### Phase C: Analytics Dashboard

## Technology Stack:
This will be discussed and agred with the Python Ireland development team and updated. A suggested stack is:
- **Goal:** Slice & dice tagged content with charts and exports:
- Tag distribution bar charts
- Trends over time (multi‑line charts)
- Co‑occurrence heatmaps
- CSV/JSON export and alerts on tag‑volume changes

1. Flask / FastAPI
2. React JS frontend
3. SQLAlchemy ORM
4. SQLite DB
5. Python typing
6. pytest
7. pylint
8. GitHub Actions
_Long‑term_, incorporate video data, extend this or add apps to integrate member/sponsor/speaker data (CRM) data, build a Q&A interface (with LLMs), and eventually package this as a drop‑in portal for other Python communities. Also could build a data lake to take full ownership of content, fly to the moon, etc.

## Project development constraints:
In order to proceed with the collaborative development, on GitHub, the app structure must be completed first. A suggestion would be to create a fresh cookiecutter-flask instance, and begin from there.
Once the app structure is in place, 2 files can be created, meetup_scraper.py and py_con_scraper.py, which will allow parallel development on the 3 main project tracks.
---

## 🛠 Technology Stack

### Backend (Under Construction)

- **Framework:** FastAPI
- **Primary Store:** PostgreSQL (JSONB)
- **Search & Analytics:** Elasticsearch
- **ORM & Migrations:** SQLAlchemy + Alembic
- **Auth:** OAuth2 / JWT

### Frontend

- **Build Tool:** Vite v6.3.5
- **Library:** React v19.1.0 + TypeScript v5.8.3
- **UI Components:** MUI v7.1.1 (`@mui/material`, `@mui/lab`, `@mui/icons-material`)
- **Data Grid & Pickers:** `@mui/x-data-grid` v8.5.1, `@mui/x-date-pickers` v8.5.1
- **Styling:** Emotion v11.14.0
- **Charts:** Recharts v2.15.3
- **Routing:** React Router v7.6.2
- **Elasticsearch Client:** `@elastic/elasticsearch` (latest)
- **Dates:** date-fns v4.1.0

---

## 📦 Frontend: Install & Run

1. **Ensure Node 20+**:

```bash
node --version # should be 20.x

```

2. **Install dependencies**:

```bash
cd frontend
npm install
```

3. **Configure backend URL** (optional, defaults to http://localhost:8000):
Create a .env:
`bash
echo "VITE_BACKEND_URL=http://localhost:8000" > .env
`
4. **Run the development server**:
```bash
npm run dev
```
Open http://localhost:5173/explorer to see the skeleton Explorer page.

## 🚧 Backend: Under Construction

We’ll soon add:

API endpoints in FastAPI for /explorer, /tags, /explorer/{id}, etc.

Ingestion jobs to pull Meetup.com and Sessionize data into Postgres + Elasticsearch.

# Architecture

```mermaid
flowchart LR
A["Ingest jobs<br/>(Meetup, Sessionize)"]
B["Data lake<br/>(Postgres, ES)"]
C["API layer<br/>(FastAPI REST/GraphQL)"]
D["Frontend<br/>(React + Vite)"]

A --> B --> C --> D

%% future work
subgraph Future
direction LR
E["Embeddings<br/>Vector DB (Pinecone or ES)"]
F["Q&A Service"]
E --> F
end

%% link present to future
B --> E


```

### LLM Integration (Future)

- **Goal:** Use LLMs to answer questions about the data, generate summaries, and provide insights.
2 changes: 0 additions & 2 deletions frontend/.dockerignore

This file was deleted.

1 change: 0 additions & 1 deletion frontend/.env.development_example

This file was deleted.

51 changes: 0 additions & 51 deletions frontend/.eslintrc.js

This file was deleted.

24 changes: 24 additions & 0 deletions frontend/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
5 changes: 0 additions & 5 deletions frontend/.prettierrc.js

This file was deleted.

18 changes: 0 additions & 18 deletions frontend/Dockerfile

This file was deleted.

122 changes: 54 additions & 68 deletions frontend/README.md
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Available Scripts

In the project directory, you can run:

### `npm start`

Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.

The page will reload if you make edits.<br />
You will also see any lint errors in the console.

### `npm test`

Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.

### `npm run build`

Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

### `npm run eject`

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

### Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

### Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

### Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

### Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

### `npm run build` fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default tseslint.config({
extends: [
// Remove ...tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
})
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
plugins: {
// Add the react-x and react-dom plugins
'react-x': reactX,
'react-dom': reactDom,
},
rules: {
// other rules...
// Enable its recommended typescript rules
...reactX.configs['recommended-typescript'].rules,
...reactDom.configs.recommended.rules,
},
})
```
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 111 additions & 38 deletions README.md
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,124 @@
# python_ireland_talk_database
An application capable of creating a historical database for all Python Ireland talks. PyCon Ireland, Limerick and monthly meetups.

# Python Ireland talks database:
A modern “intelligence platform” for Python Ireland—aggregating all past talk and event metadata into a searchable, taggable, and analyzable system.

## Project ideas:
1. Create a searchable database of past Meetups.
2. Create a searchable database of all PyCon talks & videos.
3. Create a web application to display Meetup & PyCon meta data
---

## Introduction:
For Python Ireland, we would like to create a historical database of each of the presentations given, at both our monthly meetups and PyCon Ireland and Limerick conferences.
This data can then be used to help us make informed decisions about upcoming events, for example:
## 🎯 Vision & Phases

### Meetups:
1. If we can find a venue who used to host us in the past - we can reach out and ask them to host us again.
2. If we have had speakers for a given topic we would like to reach out to.
3. See when was the last time we presented a given topic - when was the last "Python for beginners" type talk given?
We’re building the first part in three iterative phases, with room to grow into a fuller information portal:

### PyCons:
1. See all talks by a given speaker.
2. See all talks for a given subject.
3. Decide to we have enough scope to split rooms into dedicated tracks, data science, AI, web dev, etc.
### Phase A: Talk Content Explorer

## Application structure:
This will be discussed and agred with the Python Ireland development team and updated. A suggested structure is: https://github.com/cookiecutter-flask/cookiecutter-flask
- **Goal:** Ingest Meetup & Sessionize data into Elasticsearch + Postgres, and build a React/Vite front‑end “Explorer”:
- Filter by date, platform, full‑text search of titles & descriptions
- Inline tagging of individual items
- Detail drawer for full metadata (speakers, links, etc.)

The required application will need to be capable of 3 things:
1. Scraping the Meetup API.
2. Scraping PyCon Ireland data (Sessionize API?, Sessionize csv file?).
3. Presenting the data in an easily digestible format.
### Phase B: Taxonomy Manager

For the above application we will use a templated web application (Flask or other framework) to house the main application #3, above. For items #1 and #2, above we will store the code in a relevant class object that can be called, standalone, from their own main.py type file.
- **Goal:** Curate the raw tags into a structured hierarchy:
- Tag list with parent/child relationships
- Drag‑and‑drop tree builder
- Tag metadata (colors, descriptions, aliases)
- Saved tag sets for quick filtering

An example
### Phase C: Analytics Dashboard

## Technology Stack:
This will be discussed and agred with the Python Ireland development team and updated. A suggested stack is:
- **Goal:** Slice & dice tagged content with charts and exports:
- Tag distribution bar charts
- Trends over time (multi‑line charts)
- Co‑occurrence heatmaps
- CSV/JSON export and alerts on tag‑volume changes

1. Flask / FastAPI
2. React JS frontend
3. SQLAlchemy ORM
4. SQLite DB
5. Python typing
6. pytest
7. pylint
8. GitHub Actions
_Long‑term_, incorporate video data, extend this or add apps to integrate member/sponsor/speaker data (CRM) data, build a Q&A interface (with LLMs), and eventually package this as a drop‑in portal for other Python communities. Also could build a data lake to take full ownership of content, fly to the moon, etc.

## Project development constraints:
In order to proceed with the collaborative development, on GitHub, the app structure must be completed first. A suggestion would be to create a fresh cookiecutter-flask instance, and begin from there.
Once the app structure is in place, 2 files can be created, meetup_scraper.py and py_con_scraper.py, which will allow parallel development on the 3 main project tracks.
---

## 🛠 Technology Stack

### Backend (Under Construction)

- **Framework:** FastAPI
- **Primary Store:** PostgreSQL (JSONB)
- **Search & Analytics:** Elasticsearch
- **ORM & Migrations:** SQLAlchemy + Alembic
- **Auth:** OAuth2 / JWT

### Frontend

- **Build Tool:** Vite v6.3.5
- **Library:** React v19.1.0 + TypeScript v5.8.3
- **UI Components:** MUI v7.1.1 (`@mui/material`, `@mui/lab`, `@mui/icons-material`)
- **Data Grid & Pickers:** `@mui/x-data-grid` v8.5.1, `@mui/x-date-pickers` v8.5.1
- **Styling:** Emotion v11.14.0
- **Charts:** Recharts v2.15.3
- **Routing:** React Router v7.6.2
- **Elasticsearch Client:** `@elastic/elasticsearch` (latest)
- **Dates:** date-fns v4.1.0

---

## 📦 Frontend: Install & Run

1. **Ensure Node 20+**:

```bash
node --version # should be 20.x

```

2. **Install dependencies**:

```bash
cd frontend
npm install
```

3. **Configure backend URL** (optional, defaults to http://localhost:8000):
Create a .env:
`bash
echo "VITE_BACKEND_URL=http://localhost:8000" > .env
`
4. **Run the development server**:
```bash
npm run dev
```
Open http://localhost:5173/explorer to see the skeleton Explorer page.

## 🚧 Backend: Under Construction

We’ll soon add:

API endpoints in FastAPI for /explorer, /tags, /explorer/{id}, etc.

Ingestion jobs to pull Meetup.com and Sessionize data into Postgres + Elasticsearch.

# Architecture

```mermaid
flowchart LR
A["Ingest jobs<br/>(Meetup, Sessionize)"]
B["Data lake<br/>(Postgres, ES)"]
C["API layer<br/>(FastAPI REST/GraphQL)"]
D["Frontend<br/>(React + Vite)"]

A --> B --> C --> D

%% future work
subgraph Future
direction LR
E["Embeddings<br/>Vector DB (Pinecone or ES)"]
F["Q&A Service"]
E --> F
end

%% link present to future
B --> E


```

### LLM Integration (Future)

- **Goal:** Use LLMs to answer questions about the data, generate summaries, and provide insights.
2 changes: 0 additions & 2 deletions frontend/.dockerignore

This file was deleted.

1 change: 0 additions & 1 deletion frontend/.env.development_example

This file was deleted.

51 changes: 0 additions & 51 deletions frontend/.eslintrc.js

This file was deleted.

24 changes: 24 additions & 0 deletions frontend/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
5 changes: 0 additions & 5 deletions frontend/.prettierrc.js

This file was deleted.

18 changes: 0 additions & 18 deletions frontend/Dockerfile

This file was deleted.

122 changes: 54 additions & 68 deletions frontend/README.md
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Available Scripts

In the project directory, you can run:

### `npm start`

Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.

The page will reload if you make edits.<br />
You will also see any lint errors in the console.

### `npm test`

Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.

### `npm run build`

Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

### `npm run eject`

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

### Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

### Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

### Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

### Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

### `npm run build` fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default tseslint.config({
extends: [
// Remove ...tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
})
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
plugins: {
// Add the react-x and react-dom plugins
'react-x': reactX,
'react-dom': reactDom,
},
rules: {
// other rules...
// Enable its recommended typescript rules
...reactX.configs['recommended-typescript'].rules,
...reactDom.configs.recommended.rules,
},
})
```
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 111 additions & 38 deletions README.md
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,124 @@
# python_ireland_talk_database
An application capable of creating a historical database for all Python Ireland talks. PyCon Ireland, Limerick and monthly meetups.

# Python Ireland talks database:
A modern “intelligence platform” for Python Ireland—aggregating all past talk and event metadata into a searchable, taggable, and analyzable system.

## Project ideas:
1. Create a searchable database of past Meetups.
2. Create a searchable database of all PyCon talks & videos.
3. Create a web application to display Meetup & PyCon meta data
---

## Introduction:
For Python Ireland, we would like to create a historical database of each of the presentations given, at both our monthly meetups and PyCon Ireland and Limerick conferences.
This data can then be used to help us make informed decisions about upcoming events, for example:
## 🎯 Vision & Phases

### Meetups:
1. If we can find a venue who used to host us in the past - we can reach out and ask them to host us again.
2. If we have had speakers for a given topic we would like to reach out to.
3. See when was the last time we presented a given topic - when was the last "Python for beginners" type talk given?
We’re building the first part in three iterative phases, with room to grow into a fuller information portal:

### PyCons:
1. See all talks by a given speaker.
2. See all talks for a given subject.
3. Decide to we have enough scope to split rooms into dedicated tracks, data science, AI, web dev, etc.
### Phase A: Talk Content Explorer

## Application structure:
This will be discussed and agred with the Python Ireland development team and updated. A suggested structure is: https://github.com/cookiecutter-flask/cookiecutter-flask
- **Goal:** Ingest Meetup & Sessionize data into Elasticsearch + Postgres, and build a React/Vite front‑end “Explorer”:
- Filter by date, platform, full‑text search of titles & descriptions
- Inline tagging of individual items
- Detail drawer for full metadata (speakers, links, etc.)

The required application will need to be capable of 3 things:
1. Scraping the Meetup API.
2. Scraping PyCon Ireland data (Sessionize API?, Sessionize csv file?).
3. Presenting the data in an easily digestible format.
### Phase B: Taxonomy Manager

For the above application we will use a templated web application (Flask or other framework) to house the main application #3, above. For items #1 and #2, above we will store the code in a relevant class object that can be called, standalone, from their own main.py type file.
- **Goal:** Curate the raw tags into a structured hierarchy:
- Tag list with parent/child relationships
- Drag‑and‑drop tree builder
- Tag metadata (colors, descriptions, aliases)
- Saved tag sets for quick filtering

An example
### Phase C: Analytics Dashboard

## Technology Stack:
This will be discussed and agred with the Python Ireland development team and updated. A suggested stack is:
- **Goal:** Slice & dice tagged content with charts and exports:
- Tag distribution bar charts
- Trends over time (multi‑line charts)
- Co‑occurrence heatmaps
- CSV/JSON export and alerts on tag‑volume changes

1. Flask / FastAPI
2. React JS frontend
3. SQLAlchemy ORM
4. SQLite DB
5. Python typing
6. pytest
7. pylint
8. GitHub Actions
_Long‑term_, incorporate video data, extend this or add apps to integrate member/sponsor/speaker data (CRM) data, build a Q&A interface (with LLMs), and eventually package this as a drop‑in portal for other Python communities. Also could build a data lake to take full ownership of content, fly to the moon, etc.

## Project development constraints:
In order to proceed with the collaborative development, on GitHub, the app structure must be completed first. A suggestion would be to create a fresh cookiecutter-flask instance, and begin from there.
Once the app structure is in place, 2 files can be created, meetup_scraper.py and py_con_scraper.py, which will allow parallel development on the 3 main project tracks.
---

## 🛠 Technology Stack

### Backend (Under Construction)

- **Framework:** FastAPI
- **Primary Store:** PostgreSQL (JSONB)
- **Search & Analytics:** Elasticsearch
- **ORM & Migrations:** SQLAlchemy + Alembic
- **Auth:** OAuth2 / JWT

### Frontend

- **Build Tool:** Vite v6.3.5
- **Library:** React v19.1.0 + TypeScript v5.8.3
- **UI Components:** MUI v7.1.1 (`@mui/material`, `@mui/lab`, `@mui/icons-material`)
- **Data Grid & Pickers:** `@mui/x-data-grid` v8.5.1, `@mui/x-date-pickers` v8.5.1
- **Styling:** Emotion v11.14.0
- **Charts:** Recharts v2.15.3
- **Routing:** React Router v7.6.2
- **Elasticsearch Client:** `@elastic/elasticsearch` (latest)
- **Dates:** date-fns v4.1.0

---

## 📦 Frontend: Install & Run

1. **Ensure Node 20+**:

```bash
node --version # should be 20.x

```

2. **Install dependencies**:

```bash
cd frontend
npm install
```

3. **Configure backend URL** (optional, defaults to http://localhost:8000):
Create a .env:
`bash
echo "VITE_BACKEND_URL=http://localhost:8000" > .env
`
4. **Run the development server**:
```bash
npm run dev
```
Open http://localhost:5173/explorer to see the skeleton Explorer page.

## 🚧 Backend: Under Construction

We’ll soon add:

API endpoints in FastAPI for /explorer, /tags, /explorer/{id}, etc.

Ingestion jobs to pull Meetup.com and Sessionize data into Postgres + Elasticsearch.

# Architecture

```mermaid
flowchart LR
A["Ingest jobs<br/>(Meetup, Sessionize)"]
B["Data lake<br/>(Postgres, ES)"]
C["API layer<br/>(FastAPI REST/GraphQL)"]
D["Frontend<br/>(React + Vite)"]

A --> B --> C --> D

%% future work
subgraph Future
direction LR
E["Embeddings<br/>Vector DB (Pinecone or ES)"]
F["Q&A Service"]
E --> F
end

%% link present to future
B --> E


```

### LLM Integration (Future)

- **Goal:** Use LLMs to answer questions about the data, generate summaries, and provide insights.
2 changes: 0 additions & 2 deletions frontend/.dockerignore

This file was deleted.

1 change: 0 additions & 1 deletion frontend/.env.development_example

This file was deleted.

51 changes: 0 additions & 51 deletions frontend/.eslintrc.js

This file was deleted.

24 changes: 24 additions & 0 deletions frontend/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
5 changes: 0 additions & 5 deletions frontend/.prettierrc.js

This file was deleted.

18 changes: 0 additions & 18 deletions frontend/Dockerfile

This file was deleted.

122 changes: 54 additions & 68 deletions frontend/README.md
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Available Scripts

In the project directory, you can run:

### `npm start`

Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.

The page will reload if you make edits.<br />
You will also see any lint errors in the console.

### `npm test`

Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.

### `npm run build`

Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

### `npm run eject`

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

### Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

### Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

### Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

### Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

### `npm run build` fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default tseslint.config({
extends: [
// Remove ...tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
})
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
plugins: {
// Add the react-x and react-dom plugins
'react-x': reactX,
'react-dom': reactDom,
},
rules: {
// other rules...
// Enable its recommended typescript rules
...reactX.configs['recommended-typescript'].rules,
...reactDom.configs.recommended.rules,
},
})
```
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 111 additions & 38 deletions README.md
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,124 @@
# python_ireland_talk_database
An application capable of creating a historical database for all Python Ireland talks. PyCon Ireland, Limerick and monthly meetups.

# Python Ireland talks database:
A modern “intelligence platform” for Python Ireland—aggregating all past talk and event metadata into a searchable, taggable, and analyzable system.

## Project ideas:
1. Create a searchable database of past Meetups.
2. Create a searchable database of all PyCon talks & videos.
3. Create a web application to display Meetup & PyCon meta data
---

## Introduction:
For Python Ireland, we would like to create a historical database of each of the presentations given, at both our monthly meetups and PyCon Ireland and Limerick conferences.
This data can then be used to help us make informed decisions about upcoming events, for example:
## 🎯 Vision & Phases

### Meetups:
1. If we can find a venue who used to host us in the past - we can reach out and ask them to host us again.
2. If we have had speakers for a given topic we would like to reach out to.
3. See when was the last time we presented a given topic - when was the last "Python for beginners" type talk given?
We’re building the first part in three iterative phases, with room to grow into a fuller information portal:

### PyCons:
1. See all talks by a given speaker.
2. See all talks for a given subject.
3. Decide to we have enough scope to split rooms into dedicated tracks, data science, AI, web dev, etc.
### Phase A: Talk Content Explorer

## Application structure:
This will be discussed and agred with the Python Ireland development team and updated. A suggested structure is: https://github.com/cookiecutter-flask/cookiecutter-flask
- **Goal:** Ingest Meetup & Sessionize data into Elasticsearch + Postgres, and build a React/Vite front‑end “Explorer”:
- Filter by date, platform, full‑text search of titles & descriptions
- Inline tagging of individual items
- Detail drawer for full metadata (speakers, links, etc.)

The required application will need to be capable of 3 things:
1. Scraping the Meetup API.
2. Scraping PyCon Ireland data (Sessionize API?, Sessionize csv file?).
3. Presenting the data in an easily digestible format.
### Phase B: Taxonomy Manager

For the above application we will use a templated web application (Flask or other framework) to house the main application #3, above. For items #1 and #2, above we will store the code in a relevant class object that can be called, standalone, from their own main.py type file.
- **Goal:** Curate the raw tags into a structured hierarchy:
- Tag list with parent/child relationships
- Drag‑and‑drop tree builder
- Tag metadata (colors, descriptions, aliases)
- Saved tag sets for quick filtering

An example
### Phase C: Analytics Dashboard

## Technology Stack:
This will be discussed and agred with the Python Ireland development team and updated. A suggested stack is:
- **Goal:** Slice & dice tagged content with charts and exports:
- Tag distribution bar charts
- Trends over time (multi‑line charts)
- Co‑occurrence heatmaps
- CSV/JSON export and alerts on tag‑volume changes

1. Flask / FastAPI
2. React JS frontend
3. SQLAlchemy ORM
4. SQLite DB
5. Python typing
6. pytest
7. pylint
8. GitHub Actions
_Long‑term_, incorporate video data, extend this or add apps to integrate member/sponsor/speaker data (CRM) data, build a Q&A interface (with LLMs), and eventually package this as a drop‑in portal for other Python communities. Also could build a data lake to take full ownership of content, fly to the moon, etc.

## Project development constraints:
In order to proceed with the collaborative development, on GitHub, the app structure must be completed first. A suggestion would be to create a fresh cookiecutter-flask instance, and begin from there.
Once the app structure is in place, 2 files can be created, meetup_scraper.py and py_con_scraper.py, which will allow parallel development on the 3 main project tracks.
---

## 🛠 Technology Stack

### Backend (Under Construction)

- **Framework:** FastAPI
- **Primary Store:** PostgreSQL (JSONB)
- **Search & Analytics:** Elasticsearch
- **ORM & Migrations:** SQLAlchemy + Alembic
- **Auth:** OAuth2 / JWT

### Frontend

- **Build Tool:** Vite v6.3.5
- **Library:** React v19.1.0 + TypeScript v5.8.3
- **UI Components:** MUI v7.1.1 (`@mui/material`, `@mui/lab`, `@mui/icons-material`)
- **Data Grid & Pickers:** `@mui/x-data-grid` v8.5.1, `@mui/x-date-pickers` v8.5.1
- **Styling:** Emotion v11.14.0
- **Charts:** Recharts v2.15.3
- **Routing:** React Router v7.6.2
- **Elasticsearch Client:** `@elastic/elasticsearch` (latest)
- **Dates:** date-fns v4.1.0

---

## 📦 Frontend: Install & Run

1. **Ensure Node 20+**:

```bash
node --version # should be 20.x

```

2. **Install dependencies**:

```bash
cd frontend
npm install
```

3. **Configure backend URL** (optional, defaults to http://localhost:8000):
Create a .env:
`bash
echo "VITE_BACKEND_URL=http://localhost:8000" > .env
`
4. **Run the development server**:
```bash
npm run dev
```
Open http://localhost:5173/explorer to see the skeleton Explorer page.

## 🚧 Backend: Under Construction

We’ll soon add:

API endpoints in FastAPI for /explorer, /tags, /explorer/{id}, etc.

Ingestion jobs to pull Meetup.com and Sessionize data into Postgres + Elasticsearch.

# Architecture

```mermaid
flowchart LR
A["Ingest jobs<br/>(Meetup, Sessionize)"]
B["Data lake<br/>(Postgres, ES)"]
C["API layer<br/>(FastAPI REST/GraphQL)"]
D["Frontend<br/>(React + Vite)"]

A --> B --> C --> D

%% future work
subgraph Future
direction LR
E["Embeddings<br/>Vector DB (Pinecone or ES)"]
F["Q&A Service"]
E --> F
end

%% link present to future
B --> E


```

### LLM Integration (Future)

- **Goal:** Use LLMs to answer questions about the data, generate summaries, and provide insights.
2 changes: 0 additions & 2 deletions frontend/.dockerignore

This file was deleted.

1 change: 0 additions & 1 deletion frontend/.env.development_example

This file was deleted.

51 changes: 0 additions & 51 deletions frontend/.eslintrc.js

This file was deleted.

24 changes: 24 additions & 0 deletions frontend/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
5 changes: 0 additions & 5 deletions frontend/.prettierrc.js

This file was deleted.

18 changes: 0 additions & 18 deletions frontend/Dockerfile

This file was deleted.

122 changes: 54 additions & 68 deletions frontend/README.md
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Available Scripts

In the project directory, you can run:

### `npm start`

Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.

The page will reload if you make edits.<br />
You will also see any lint errors in the console.

### `npm test`

Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.

### `npm run build`

Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

### `npm run eject`

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

### Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

### Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

### Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

### Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

### `npm run build` fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default tseslint.config({
extends: [
// Remove ...tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
})
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
plugins: {
// Add the react-x and react-dom plugins
'react-x': reactX,
'react-dom': reactDom,
},
rules: {
// other rules...
// Enable its recommended typescript rules
...reactX.configs['recommended-typescript'].rules,
...reactDom.configs.recommended.rules,
},
})
```
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 111 additions & 38 deletions README.md
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,124 @@
# python_ireland_talk_database
An application capable of creating a historical database for all Python Ireland talks. PyCon Ireland, Limerick and monthly meetups.

# Python Ireland talks database:
A modern “intelligence platform” for Python Ireland—aggregating all past talk and event metadata into a searchable, taggable, and analyzable system.

## Project ideas:
1. Create a searchable database of past Meetups.
2. Create a searchable database of all PyCon talks & videos.
3. Create a web application to display Meetup & PyCon meta data
---

## Introduction:
For Python Ireland, we would like to create a historical database of each of the presentations given, at both our monthly meetups and PyCon Ireland and Limerick conferences.
This data can then be used to help us make informed decisions about upcoming events, for example:
## 🎯 Vision & Phases

### Meetups:
1. If we can find a venue who used to host us in the past - we can reach out and ask them to host us again.
2. If we have had speakers for a given topic we would like to reach out to.
3. See when was the last time we presented a given topic - when was the last "Python for beginners" type talk given?
We’re building the first part in three iterative phases, with room to grow into a fuller information portal:

### PyCons:
1. See all talks by a given speaker.
2. See all talks for a given subject.
3. Decide to we have enough scope to split rooms into dedicated tracks, data science, AI, web dev, etc.
### Phase A: Talk Content Explorer

## Application structure:
This will be discussed and agred with the Python Ireland development team and updated. A suggested structure is: https://github.com/cookiecutter-flask/cookiecutter-flask
- **Goal:** Ingest Meetup & Sessionize data into Elasticsearch + Postgres, and build a React/Vite front‑end “Explorer”:
- Filter by date, platform, full‑text search of titles & descriptions
- Inline tagging of individual items
- Detail drawer for full metadata (speakers, links, etc.)

The required application will need to be capable of 3 things:
1. Scraping the Meetup API.
2. Scraping PyCon Ireland data (Sessionize API?, Sessionize csv file?).
3. Presenting the data in an easily digestible format.
### Phase B: Taxonomy Manager

For the above application we will use a templated web application (Flask or other framework) to house the main application #3, above. For items #1 and #2, above we will store the code in a relevant class object that can be called, standalone, from their own main.py type file.
- **Goal:** Curate the raw tags into a structured hierarchy:
- Tag list with parent/child relationships
- Drag‑and‑drop tree builder
- Tag metadata (colors, descriptions, aliases)
- Saved tag sets for quick filtering

An example
### Phase C: Analytics Dashboard

## Technology Stack:
This will be discussed and agred with the Python Ireland development team and updated. A suggested stack is:
- **Goal:** Slice & dice tagged content with charts and exports:
- Tag distribution bar charts
- Trends over time (multi‑line charts)
- Co‑occurrence heatmaps
- CSV/JSON export and alerts on tag‑volume changes

1. Flask / FastAPI
2. React JS frontend
3. SQLAlchemy ORM
4. SQLite DB
5. Python typing
6. pytest
7. pylint
8. GitHub Actions
_Long‑term_, incorporate video data, extend this or add apps to integrate member/sponsor/speaker data (CRM) data, build a Q&A interface (with LLMs), and eventually package this as a drop‑in portal for other Python communities. Also could build a data lake to take full ownership of content, fly to the moon, etc.

## Project development constraints:
In order to proceed with the collaborative development, on GitHub, the app structure must be completed first. A suggestion would be to create a fresh cookiecutter-flask instance, and begin from there.
Once the app structure is in place, 2 files can be created, meetup_scraper.py and py_con_scraper.py, which will allow parallel development on the 3 main project tracks.
---

## 🛠 Technology Stack

### Backend (Under Construction)

- **Framework:** FastAPI
- **Primary Store:** PostgreSQL (JSONB)
- **Search & Analytics:** Elasticsearch
- **ORM & Migrations:** SQLAlchemy + Alembic
- **Auth:** OAuth2 / JWT

### Frontend

- **Build Tool:** Vite v6.3.5
- **Library:** React v19.1.0 + TypeScript v5.8.3
- **UI Components:** MUI v7.1.1 (`@mui/material`, `@mui/lab`, `@mui/icons-material`)
- **Data Grid & Pickers:** `@mui/x-data-grid` v8.5.1, `@mui/x-date-pickers` v8.5.1
- **Styling:** Emotion v11.14.0
- **Charts:** Recharts v2.15.3
- **Routing:** React Router v7.6.2
- **Elasticsearch Client:** `@elastic/elasticsearch` (latest)
- **Dates:** date-fns v4.1.0

---

## 📦 Frontend: Install & Run

1. **Ensure Node 20+**:

```bash
node --version # should be 20.x

```

2. **Install dependencies**:

```bash
cd frontend
npm install
```

3. **Configure backend URL** (optional, defaults to http://localhost:8000):
Create a .env:
`bash
echo "VITE_BACKEND_URL=http://localhost:8000" > .env
`
4. **Run the development server**:
```bash
npm run dev
```
Open http://localhost:5173/explorer to see the skeleton Explorer page.

## 🚧 Backend: Under Construction

We’ll soon add:

API endpoints in FastAPI for /explorer, /tags, /explorer/{id}, etc.

Ingestion jobs to pull Meetup.com and Sessionize data into Postgres + Elasticsearch.

# Architecture

```mermaid
flowchart LR
A["Ingest jobs<br/>(Meetup, Sessionize)"]
B["Data lake<br/>(Postgres, ES)"]
C["API layer<br/>(FastAPI REST/GraphQL)"]
D["Frontend<br/>(React + Vite)"]

A --> B --> C --> D

%% future work
subgraph Future
direction LR
E["Embeddings<br/>Vector DB (Pinecone or ES)"]
F["Q&A Service"]
E --> F
end

%% link present to future
B --> E


```

### LLM Integration (Future)

- **Goal:** Use LLMs to answer questions about the data, generate summaries, and provide insights.
2 changes: 0 additions & 2 deletions frontend/.dockerignore

This file was deleted.

1 change: 0 additions & 1 deletion frontend/.env.development_example

This file was deleted.

51 changes: 0 additions & 51 deletions frontend/.eslintrc.js

This file was deleted.

24 changes: 24 additions & 0 deletions frontend/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
5 changes: 0 additions & 5 deletions frontend/.prettierrc.js

This file was deleted.

18 changes: 0 additions & 18 deletions frontend/Dockerfile

This file was deleted.

122 changes: 54 additions & 68 deletions frontend/README.md
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Available Scripts

In the project directory, you can run:

### `npm start`

Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.

The page will reload if you make edits.<br />
You will also see any lint errors in the console.

### `npm test`

Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.

### `npm run build`

Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

### `npm run eject`

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

### Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

### Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

### Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

### Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

### `npm run build` fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default tseslint.config({
extends: [
// Remove ...tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
})
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
plugins: {
// Add the react-x and react-dom plugins
'react-x': reactX,
'react-dom': reactDom,
},
rules: {
// other rules...
// Enable its recommended typescript rules
...reactX.configs['recommended-typescript'].rules,
...reactDom.configs.recommended.rules,
},
})
```
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 111 additions & 38 deletions README.md
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,124 @@
# python_ireland_talk_database
An application capable of creating a historical database for all Python Ireland talks. PyCon Ireland, Limerick and monthly meetups.

# Python Ireland talks database:
A modern “intelligence platform” for Python Ireland—aggregating all past talk and event metadata into a searchable, taggable, and analyzable system.

## Project ideas:
1. Create a searchable database of past Meetups.
2. Create a searchable database of all PyCon talks & videos.
3. Create a web application to display Meetup & PyCon meta data
---

## Introduction:
For Python Ireland, we would like to create a historical database of each of the presentations given, at both our monthly meetups and PyCon Ireland and Limerick conferences.
This data can then be used to help us make informed decisions about upcoming events, for example:
## 🎯 Vision & Phases

### Meetups:
1. If we can find a venue who used to host us in the past - we can reach out and ask them to host us again.
2. If we have had speakers for a given topic we would like to reach out to.
3. See when was the last time we presented a given topic - when was the last "Python for beginners" type talk given?
We’re building the first part in three iterative phases, with room to grow into a fuller information portal:

### PyCons:
1. See all talks by a given speaker.
2. See all talks for a given subject.
3. Decide to we have enough scope to split rooms into dedicated tracks, data science, AI, web dev, etc.
### Phase A: Talk Content Explorer

## Application structure:
This will be discussed and agred with the Python Ireland development team and updated. A suggested structure is: https://github.com/cookiecutter-flask/cookiecutter-flask
- **Goal:** Ingest Meetup & Sessionize data into Elasticsearch + Postgres, and build a React/Vite front‑end “Explorer”:
- Filter by date, platform, full‑text search of titles & descriptions
- Inline tagging of individual items
- Detail drawer for full metadata (speakers, links, etc.)

The required application will need to be capable of 3 things:
1. Scraping the Meetup API.
2. Scraping PyCon Ireland data (Sessionize API?, Sessionize csv file?).
3. Presenting the data in an easily digestible format.
### Phase B: Taxonomy Manager

For the above application we will use a templated web application (Flask or other framework) to house the main application #3, above. For items #1 and #2, above we will store the code in a relevant class object that can be called, standalone, from their own main.py type file.
- **Goal:** Curate the raw tags into a structured hierarchy:
- Tag list with parent/child relationships
- Drag‑and‑drop tree builder
- Tag metadata (colors, descriptions, aliases)
- Saved tag sets for quick filtering

An example
### Phase C: Analytics Dashboard

## Technology Stack:
This will be discussed and agred with the Python Ireland development team and updated. A suggested stack is:
- **Goal:** Slice & dice tagged content with charts and exports:
- Tag distribution bar charts
- Trends over time (multi‑line charts)
- Co‑occurrence heatmaps
- CSV/JSON export and alerts on tag‑volume changes

1. Flask / FastAPI
2. React JS frontend
3. SQLAlchemy ORM
4. SQLite DB
5. Python typing
6. pytest
7. pylint
8. GitHub Actions
_Long‑term_, incorporate video data, extend this or add apps to integrate member/sponsor/speaker data (CRM) data, build a Q&A interface (with LLMs), and eventually package this as a drop‑in portal for other Python communities. Also could build a data lake to take full ownership of content, fly to the moon, etc.

## Project development constraints:
In order to proceed with the collaborative development, on GitHub, the app structure must be completed first. A suggestion would be to create a fresh cookiecutter-flask instance, and begin from there.
Once the app structure is in place, 2 files can be created, meetup_scraper.py and py_con_scraper.py, which will allow parallel development on the 3 main project tracks.
---

## 🛠 Technology Stack

### Backend (Under Construction)

- **Framework:** FastAPI
- **Primary Store:** PostgreSQL (JSONB)
- **Search & Analytics:** Elasticsearch
- **ORM & Migrations:** SQLAlchemy + Alembic
- **Auth:** OAuth2 / JWT

### Frontend

- **Build Tool:** Vite v6.3.5
- **Library:** React v19.1.0 + TypeScript v5.8.3
- **UI Components:** MUI v7.1.1 (`@mui/material`, `@mui/lab`, `@mui/icons-material`)
- **Data Grid & Pickers:** `@mui/x-data-grid` v8.5.1, `@mui/x-date-pickers` v8.5.1
- **Styling:** Emotion v11.14.0
- **Charts:** Recharts v2.15.3
- **Routing:** React Router v7.6.2
- **Elasticsearch Client:** `@elastic/elasticsearch` (latest)
- **Dates:** date-fns v4.1.0

---

## 📦 Frontend: Install & Run

1. **Ensure Node 20+**:

```bash
node --version # should be 20.x

```

2. **Install dependencies**:

```bash
cd frontend
npm install
```

3. **Configure backend URL** (optional, defaults to http://localhost:8000):
Create a .env:
`bash
echo "VITE_BACKEND_URL=http://localhost:8000" > .env
`
4. **Run the development server**:
```bash
npm run dev
```
Open http://localhost:5173/explorer to see the skeleton Explorer page.

## 🚧 Backend: Under Construction

We’ll soon add:

API endpoints in FastAPI for /explorer, /tags, /explorer/{id}, etc.

Ingestion jobs to pull Meetup.com and Sessionize data into Postgres + Elasticsearch.

# Architecture

```mermaid
flowchart LR
A["Ingest jobs<br/>(Meetup, Sessionize)"]
B["Data lake<br/>(Postgres, ES)"]
C["API layer<br/>(FastAPI REST/GraphQL)"]
D["Frontend<br/>(React + Vite)"]

A --> B --> C --> D

%% future work
subgraph Future
direction LR
E["Embeddings<br/>Vector DB (Pinecone or ES)"]
F["Q&A Service"]
E --> F
end

%% link present to future
B --> E


```

### LLM Integration (Future)

- **Goal:** Use LLMs to answer questions about the data, generate summaries, and provide insights.
2 changes: 0 additions & 2 deletions frontend/.dockerignore

This file was deleted.

1 change: 0 additions & 1 deletion frontend/.env.development_example

This file was deleted.

51 changes: 0 additions & 51 deletions frontend/.eslintrc.js

This file was deleted.

24 changes: 24 additions & 0 deletions frontend/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
5 changes: 0 additions & 5 deletions frontend/.prettierrc.js

This file was deleted.

18 changes: 0 additions & 18 deletions frontend/Dockerfile

This file was deleted.

122 changes: 54 additions & 68 deletions frontend/README.md
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Available Scripts

In the project directory, you can run:

### `npm start`

Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.

The page will reload if you make edits.<br />
You will also see any lint errors in the console.

### `npm test`

Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.

### `npm run build`

Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

### `npm run eject`

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

### Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

### Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

### Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

### Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

### `npm run build` fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default tseslint.config({
extends: [
// Remove ...tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
})
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
plugins: {
// Add the react-x and react-dom plugins
'react-x': reactX,
'react-dom': reactDom,
},
rules: {
// other rules...
// Enable its recommended typescript rules
...reactX.configs['recommended-typescript'].rules,
...reactDom.configs.recommended.rules,
},
})
```
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 111 additions & 38 deletions README.md
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,124 @@
# python_ireland_talk_database
An application capable of creating a historical database for all Python Ireland talks. PyCon Ireland, Limerick and monthly meetups.

# Python Ireland talks database:
A modern “intelligence platform” for Python Ireland—aggregating all past talk and event metadata into a searchable, taggable, and analyzable system.

## Project ideas:
1. Create a searchable database of past Meetups.
2. Create a searchable database of all PyCon talks & videos.
3. Create a web application to display Meetup & PyCon meta data
---

## Introduction:
For Python Ireland, we would like to create a historical database of each of the presentations given, at both our monthly meetups and PyCon Ireland and Limerick conferences.
This data can then be used to help us make informed decisions about upcoming events, for example:
## 🎯 Vision & Phases

### Meetups:
1. If we can find a venue who used to host us in the past - we can reach out and ask them to host us again.
2. If we have had speakers for a given topic we would like to reach out to.
3. See when was the last time we presented a given topic - when was the last "Python for beginners" type talk given?
We’re building the first part in three iterative phases, with room to grow into a fuller information portal:

### PyCons:
1. See all talks by a given speaker.
2. See all talks for a given subject.
3. Decide to we have enough scope to split rooms into dedicated tracks, data science, AI, web dev, etc.
### Phase A: Talk Content Explorer

## Application structure:
This will be discussed and agred with the Python Ireland development team and updated. A suggested structure is: https://github.com/cookiecutter-flask/cookiecutter-flask
- **Goal:** Ingest Meetup & Sessionize data into Elasticsearch + Postgres, and build a React/Vite front‑end “Explorer”:
- Filter by date, platform, full‑text search of titles & descriptions
- Inline tagging of individual items
- Detail drawer for full metadata (speakers, links, etc.)

The required application will need to be capable of 3 things:
1. Scraping the Meetup API.
2. Scraping PyCon Ireland data (Sessionize API?, Sessionize csv file?).
3. Presenting the data in an easily digestible format.
### Phase B: Taxonomy Manager

For the above application we will use a templated web application (Flask or other framework) to house the main application #3, above. For items #1 and #2, above we will store the code in a relevant class object that can be called, standalone, from their own main.py type file.
- **Goal:** Curate the raw tags into a structured hierarchy:
- Tag list with parent/child relationships
- Drag‑and‑drop tree builder
- Tag metadata (colors, descriptions, aliases)
- Saved tag sets for quick filtering

An example
### Phase C: Analytics Dashboard

## Technology Stack:
This will be discussed and agred with the Python Ireland development team and updated. A suggested stack is:
- **Goal:** Slice & dice tagged content with charts and exports:
- Tag distribution bar charts
- Trends over time (multi‑line charts)
- Co‑occurrence heatmaps
- CSV/JSON export and alerts on tag‑volume changes

1. Flask / FastAPI
2. React JS frontend
3. SQLAlchemy ORM
4. SQLite DB
5. Python typing
6. pytest
7. pylint
8. GitHub Actions
_Long‑term_, incorporate video data, extend this or add apps to integrate member/sponsor/speaker data (CRM) data, build a Q&A interface (with LLMs), and eventually package this as a drop‑in portal for other Python communities. Also could build a data lake to take full ownership of content, fly to the moon, etc.

## Project development constraints:
In order to proceed with the collaborative development, on GitHub, the app structure must be completed first. A suggestion would be to create a fresh cookiecutter-flask instance, and begin from there.
Once the app structure is in place, 2 files can be created, meetup_scraper.py and py_con_scraper.py, which will allow parallel development on the 3 main project tracks.
---

## 🛠 Technology Stack

### Backend (Under Construction)

- **Framework:** FastAPI
- **Primary Store:** PostgreSQL (JSONB)
- **Search & Analytics:** Elasticsearch
- **ORM & Migrations:** SQLAlchemy + Alembic
- **Auth:** OAuth2 / JWT

### Frontend

- **Build Tool:** Vite v6.3.5
- **Library:** React v19.1.0 + TypeScript v5.8.3
- **UI Components:** MUI v7.1.1 (`@mui/material`, `@mui/lab`, `@mui/icons-material`)
- **Data Grid & Pickers:** `@mui/x-data-grid` v8.5.1, `@mui/x-date-pickers` v8.5.1
- **Styling:** Emotion v11.14.0
- **Charts:** Recharts v2.15.3
- **Routing:** React Router v7.6.2
- **Elasticsearch Client:** `@elastic/elasticsearch` (latest)
- **Dates:** date-fns v4.1.0

---

## 📦 Frontend: Install & Run

1. **Ensure Node 20+**:

```bash
node --version # should be 20.x

```

2. **Install dependencies**:

```bash
cd frontend
npm install
```

3. **Configure backend URL** (optional, defaults to http://localhost:8000):
Create a .env:
`bash
echo "VITE_BACKEND_URL=http://localhost:8000" > .env
`
4. **Run the development server**:
```bash
npm run dev
```
Open http://localhost:5173/explorer to see the skeleton Explorer page.

## 🚧 Backend: Under Construction

We’ll soon add:

API endpoints in FastAPI for /explorer, /tags, /explorer/{id}, etc.

Ingestion jobs to pull Meetup.com and Sessionize data into Postgres + Elasticsearch.

# Architecture

```mermaid
flowchart LR
A["Ingest jobs<br/>(Meetup, Sessionize)"]
B["Data lake<br/>(Postgres, ES)"]
C["API layer<br/>(FastAPI REST/GraphQL)"]
D["Frontend<br/>(React + Vite)"]

A --> B --> C --> D

%% future work
subgraph Future
direction LR
E["Embeddings<br/>Vector DB (Pinecone or ES)"]
F["Q&A Service"]
E --> F
end

%% link present to future
B --> E


```

### LLM Integration (Future)

- **Goal:** Use LLMs to answer questions about the data, generate summaries, and provide insights.
2 changes: 0 additions & 2 deletions frontend/.dockerignore

This file was deleted.

1 change: 0 additions & 1 deletion frontend/.env.development_example

This file was deleted.

51 changes: 0 additions & 51 deletions frontend/.eslintrc.js

This file was deleted.

24 changes: 24 additions & 0 deletions frontend/.gitignore
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
5 changes: 0 additions & 5 deletions frontend/.prettierrc.js

This file was deleted.

18 changes: 0 additions & 18 deletions frontend/Dockerfile

This file was deleted.

122 changes: 54 additions & 68 deletions frontend/README.md
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).

## Available Scripts

In the project directory, you can run:

### `npm start`

Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.

The page will reload if you make edits.<br />
You will also see any lint errors in the console.

### `npm test`

Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.

### `npm run build`

Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.

### `npm run eject`

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

### Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

### Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

### Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

### Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

### `npm run build` fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default tseslint.config({
extends: [
// Remove ...tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
})
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
plugins: {
// Add the react-x and react-dom plugins
'react-x': reactX,
'react-dom': reactDom,
},
rules: {
// other rules...
// Enable its recommended typescript rules
...reactX.configs['recommended-typescript'].rules,
...reactDom.configs.recommended.rules,
},
})
```
Loading