stonith404 / pingvin-share Goto Github PK
View Code? Open in Web Editor NEWA self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing.
License: BSD 2-Clause "Simplified" License
A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing.
License: BSD 2-Clause "Simplified" License
Hello,
I'd like it if it was possible to put different settings when you're logged in and for when you're not logged in.
For example :
Logged in :
Logged off :
Thanks !
Edit : Changed title/issue and made my requests into separate issues for easier tracking
My domain is shared between my and my friends so we can share files with each others
I'd ideally want to manage things this way :
I hope I'm not asking for too much
Thanks a lot for the work already done, I'll be following this project closely.
When clicking "copy link" from the shares pages it does nothing except showing notification - no link copied:/
Hi,
even with
ALLOW_REGISTRATION=false
in the .env file, the "Get Started" button on the homepage redirects to /auth/signUp
and multiple users can register.
Also I asked myself how to add a user, if registrations are not possible. Is there a cli program, that allows to add a user ?
Also, even when not showing the Homepage the /auth/signUp
link is reachable and users can register.
Probably a wrong ENV variable --> process.env.NEXT_PUBLIC_DISABLE_REGISTRATION in signUp.tsx, should be !ALLOW_REGISTRATION
Apart from that, great work... ;)
I have disabled signup page, but left the home page enabled.
The 'Get started' button leads to Signup page, but signup is disabled.
I would suggest that IF Home page
is true
, AND Signup
if false
, THEN Get Started
button should lead to Sign in
page or it should not be displayed at all.
Hi,
I love the project the team has started. I would love to see if possible if you can include docker environment variable to allow use of:
This will allow application to run on https://somedomainname or https://someIPaddress instead of using a reverse proxy in front of application.
I tried to look for node.js file for frontend but was not able to locate it. I believe https can be activated in that file and possibly variables added that can point to cert and key files as an environment variable that can be passed by docker environment variables.
Appreciate your feedback.
Great work.
Thank you,
For Pingvin Share, the email notification only seems to work with GMail's SMTP service. Would it be possible to get compatibility with SendGrid. Currently you request the smtp host, smtp email, smtp password, and smtp port. For SendGrid to work, there also needs to be a spot for the smtp username, which can be different than the smtp email.
Just wondering haha, This looks incredible btw.
I'm unclear if this should be done and my config is incorrect or this needs to be a feature request. Once an item expires or has reached the maximum views, can an option be created to clean up and wipe them from my drive? It will eventually have a lot of junk files otherwise. Thank you and love the work so far.
I appreciate how you have added a custom username and password to the email configuration. It is helpful! The setup went smoothly, but I am missing a "Send test email" button. Clicking this would send an email and confirm that the entered email configuration is working and valid.
Troubleshooting email issues is frustrating. While I can force sending an email by creating and deleting a share, it requires more work than needed. A simple button and associated message box would be really helpful. You click the button and PV tries to send an email and at a minimum it would say "Email sent successfully" or "email failed."
A more advanced approach could provide more status details in the message box based on the response for the email server. I could envision "Message Sent", "Invalid user id", "Invalid password" or stuff like that.
A configuration page that is very well structured by categories like security, email etc.
At the end the page should look and feel like a settings page not like a .env
UI.
The current configuration page should do the job but when we want to add more configuration options like custom branding, the configuration page gets really confusing.
...
hi, first I want to say, that pingvin-shares is an amazing software! Thank you very much! I like the requested feature for generating upload links for external but known people. but for this feature, i think it is also necessary to check the files for viruses or other malware in some way. Have there already been requests in this regard? best wishes Torsten
Virus and malware scan for incoming files.
Getting error see bellow:
Error: SQLite database error
database is locked
0: migration_core::state::ApplyMigrations
at migration-engine/core/src/state.rs:186
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
[email protected] prod
prisma migrate deploy && prisma db seed && node dist/src/main
Prisma schema loaded from prisma/schema.prisma
Datasource "db": SQLite database "pingvin-share.db" at "file:../data/pingvin-share.db"
6 migrations found in prisma/migrations
Error: SQLite database error
database is locked
0: migration_core::state::ApplyMigrations
at migration-engine/core/src/state.rs:186
There should be an option that allows to upload files without authentication.
This option can be enabled/disabled with an environment variable e.g ALLOW_ANONYMOUS_SHARES
This feature should allow a user to enter email addresses while creating a share. On creation the entered email recipients should receive an email with the share link
Amazing work so far and thanks for promptly fixing the bug I submitted. Compared to the old Mozilla Send project, you seem to have enhanced most of the core functionality.
The fork that I had been using (https://github.com/timvisee/send) seems to find a way around the CloudFlare tunnels 100MB upload limit. Given how popular it is as a reverse proxy, it would be great if you do the same in this project.
Direct port access on Pingvin I can already do unlimited uploads but through the CF reverse proxy I cannot. I recall something about chunked uploads to get around this.
If the file(s) being shared are videos (e.g. mp4
), allow the user to stream/preview the file. WeTransfer does this seamlessly for example.
Perhaps there are multiple files shared and you only need one specific video. Without downloading them all, you can quickly preview/scrub/find the one you want before downloading. Or perhaps you simply want to do a remote playback without downloading anything, like streaming a video on Youtube.
I was working on issue #28 and I realized that my editor kept auto-formatting the code in a way that was different from the rest of the code. I think it would be a good idea to add a .editorconfig
file so that contributors' IDEs and formatting stay consistent.
editorconfig reference: https://editorconfig.org/
When I try to upload larger file it will just stop after few seconds.
I've set the maximum upload 10GB.
I've tried to send 2.4GB file, ISO and I get the errors 403 and 413 in console.
Using chrome to upload.
Upload normally.
Chrome
Pingvin is running fine with nginx + ssl with smaller files. I then tried to extend my max file size to 3Gb and uploaded a .rar with 2.2 GB.
Uploading large files with SSL and reverse proxy without error and creating a share you can download.
This only happens with nginx and domain https://pingvin.domain.com
I have no issues in these cases:
Firefox
{
"id": 18,
"created_on": "2021-10-08T10:31:05.000Z",
"modified_on": "2022-12-16T09:45:13.000Z",
"owner_user_id": 1,
"domain_names": [
"pingvin.domain.com"
],
"forward_host": "10.0.0.1",
"forward_port": 3000,
"access_list_id": 0,
"certificate_id": 20,
"ssl_forced": true,
"caching_enabled": false,
"block_exploits": true,
"advanced_config": "",
"meta": {
"letsencrypt_agree": false,
"dns_challenge": false
},
"allow_websocket_upgrade": false,
"http2_support": true,
"forward_scheme": "http",
"enabled": 1,
"locations": [],
"hsts_enabled": true,
"hsts_subdomains": false
}
Hey, it will be cool if you can make support for the tool ShareX
like a HTTP.POST with Header parameters like a Token and Expiration: date or security options.
direct link to the file for post it on chats or what ever,
for more information:
https://getsharex.com/docs/custom-uploader
It would be nice if there was an expiration date of "never" so that the share can be used at any time and manually deleted when no longer needed. If this is a feature you'd approve of, I wouldn't mind forking and creating a PR to implement it.
Currently the docker image is around 500mb. This should be reduced with better multi stage building.
Step to reproduce:
ๆธฌ่ฉฆ.txt
(lit. Test.txt) which contains CJK characters.%E6%B8%AC%E8%A9%A6.txt
Expected behaviour:
Pingvin should never modify the filename, except the filename is illegal on server's filesystem.
Not sure if it's a bug or a feature request but I just noticed that shares do not get deleted if the Maximal views
are reached.
Since nobody can access the share after the Maximal views
are reached anyways it would be great if the share and it's files then get removed or at least make it an option.
Shares with Maximal views
reached can't be accessed no more, IMO there is no point in keeping the share and it's files.
I don't know if anyone else has this problem and if anyone can help me find the problem. I have installed Pingvin on my Synology. The Docker containers are automatically updated via Watchtower. Every time Watchtower Pingvin I lose all my settings in Pingvin.
App url and accounts are all gone then.
And I have to set up everything again
I don't know if it's my synology or the settings. All other containers are updated normally and do not lose their settings
Firefox, Safari
Hi, great application can i have the ability to leave a note?
So i can know what i have uploaded?
Hello,
Splitting my requests as asked in my initial one
I'd like to be able to have full control of the accounts created.
So, for example, the first account ever created would be the admin, account creation would be disabled, and I would be able to create account for people I know (That's how Jellyfin works for example).
Thanks !
When I click on the link through the windows mail application, it sends me to an invalid link because the mail client considers the dot at the end of the link. However when I open the same email on the Gmail site directly it works.
Hey!
[USERNAME] shared some files with you. View or dowload the files with this link: https://exemple.com/share/UtNxQ6M.
Shared securely with Pingvin Share ๐ง
I suggest just removing the dot at the end of the link, this will fix the issue on all affected email clients.
The link should work on all email clients
This does not work on all clients because of the dot
Mail App Windows
I write on the Environment of my docker container a https://URL but if you visit the website only on http the links are all http and not catching from the APP_URL= environment, a better checking for that can be cool.
after making a Force on HTTPS all is working.
A feature that I would really like to see is the ability to generate a URL which allows for a one time file upload. This could be used in cases where you want someone to send you a file, but it is large so hard to send over discord/email.
It would work as such:
This feature should be limited to authenticated users only.
This missing feature is the only thing stopping me from deploying this on my own server, and I would love to see it.
If this is something that you would like implemented into the program, I don't mind doing it myself and opening a PR.
Hello,
Splitting my requests as asked in my initial one
I'd like to be able for my users to only use usernames to create accounts/login, I don't really need to know their emails
Thanks !
Hey,
really love pingvin and the feature to send mail notifications for shares.
Any chance we could define that notification message ourselves in a text box or something?
Given that files are being shared publicly, security is paramount. It would be great if you added 2FA as an option. Ideally, this would be configured at a user level. You could even have a setting to define the default authentication behavior for newly registered users. (e.g. 2FA or non-2FA).
It is all about added security and protection. Having it as an option would keep the flexibility of not using for those who do not want to with the option to enable it for those users who do.
Hello,
I find your project very cool, wanted to test immediately because I needed exactly such a thing. I installed it with a docker-compose on my VPS, behind a reverse proxy (caddy).
Additional configuration after installation built in very nicely, ;) I liked it.
I have uploaded a couple of small data, with which it copes very well, but as for large data (>500) upload takes very long. I had to cancel the test because it took so long. Unfortunately, I could not find in the logs why this is so slow.
For comparison:
File: APP duration
800MB ----> pingvin------> infinite
800MB----->seafile------->59s
Tip:
It would be really cool to see the upload display in percent or time, then you know when how long you still have to wait.
Otherwise, really cool project, the Config is simple and clear.
Share a file.
Access the link
I click in "Download"
I should download a file.
When I click in download a file a receive the {"message":"Unauthorized"}
Firefox & Chrome
Get passed login and open upload page
Only happens with domain AND (!) an my mobile Firefox (iOS).
Safari ist fine! Also mobile Firefox via IP.
Mobile Firefox iOS
{
"id": 18,
"created_on": "2021-10-08T10:31:05.000Z",
"modified_on": "2022-12-16T09:45:13.000Z",
"owner_user_id": 1,
"domain_names": [
"pingvin.domain.com"
],
"forward_host": "10.0.0.1",
"forward_port": 3000,
"access_list_id": 0,
"certificate_id": 20,
"ssl_forced": true,
"caching_enabled": false,
"block_exploits": true,
"advanced_config": "",
"meta": {
"letsencrypt_agree": false,
"dns_challenge": false
},
"allow_websocket_upgrade": false,
"http2_support": true,
"forward_scheme": "http",
"enabled": 1,
"locations": [],
"hsts_enabled": true,
"hsts_subdomains": false
}
When I upload a large file (minimum 8 GB recommended)
It should complete the upload
After uploading like 6.5 GB it shows "An unknown error occurred" and the upload stops.
Also the temp file will remain in /uploads/_temp until I manually delete it.
Chrome
Hi,
I have the docker container running using docker-compose.yml
I'm able to access the login page, what is the default login email and password to use?
May I ask, do you support Chinese? When do I support Chinese?
A awesome feature that you get a direkt link to the file, so you can post it on discord, steam, forums or what ever.
Hello,
Is a 2 factor authentication for the admin planned ?
so that the admin account is better protected ? with an authentication app. like google authenticator or Authy
I would be happy if this could be implemented.
Keep up the good work :)
I wrote issue #8 and realized after I opened PR #11 that it would make much more sense to have even more granular expiration selection.
Based on the source code, it shouldn't be too hard to implement. Maybe I can replace PR #11 with a feature like this?
These lines could essentially stay exactly the same:
pingvin-share/backend/src/share/share.service.ts
Lines 38 to 43 in cde22f8
Pretty much the only thing that would need to change would be:
pingvin-share/frontend/src/components/share/CreateUploadModalBody.tsx
Lines 102 to 115 in b302693
and a little bit of frontend logic.
It could even be a little more advanced, giving a preview of the exact time the share would expire:
What do you think?
Forgive the incorrect location for this. I saw your contributing section, but I don't have enough time at the moment to work on this, but I have thought about creating something similar for a few years without much success getting started.
I think a key element for a system like this is to offer the ability to create a "my account" section for those that are downloading uploads. The use case is most folks (in my estimation, at least my own mileage) use systems like this to transfer files to customers (think creative content creators). I have a buddy who works for Viacom (BET, MTV, Comedy Central, etc.) as an imaging director for their TV/Radio commercials. He uses WeTransfer (paid version) so he can get information from the download(er) such as IP address, time/date of download, etc. to verify the product was collected. Further, he uses it when other customers (smaller promoters) attempt to say they didn't get a download and dispute the CC charge.
Having a system that allows for a list of files that have been assigned to a user account so they can log in and see their past "content" would be an amazing feature, potentially even a paid feature.
I don't know if this is possible with the structure you are creating or if even is an acceptable 'request'. Would love to help with the project in the future (as time and my wife permits).
Cheers!
Hi,
The docker image (https://hub.docker.com/r/stonith404/pingvin-share) deployed yesterday does not contain the fix
Is it possible to rebuild the docker image on DockerHub?
Thanks !
In short: The setup script doesn't work on my setup.
Detail: So I followed the instructions and got my appwrite running on a reverse proxy (maybe that's the issue, if I need to connect to it via a local network, let me know) so for the hostname field I'm giving my public A record, but running into some 404 errors when running the pingvin-share setup script.
Here's the console output with UN/PW redacted:
anthony@DESKTOP-H8EKECL:~/pingvin$ docker-compose exec pingvin-share node scripts/setup.js
Welcome to the Pingvin Share Appwrite setup ๐
Please follow the questions and be sure that you ENTER THE CORRECT informations. Because the error handling isn't good.
Appwrite host (http://localhost/v1): https://appwrite.thenextweb.co.za
Authenticate...
Please enter your Appwrite credentials
Email: <Email>
Password: <Password>
Error: Request failed with status code 404
at createError (/opt/app/scripts/setup.js:1581:15)
at settle (/opt/app/scripts/setup.js:1861:12)
at IncomingMessage.handleStreamEnd (/opt/app/scripts/setup.js:777:11)
at IncomingMessage.emit (node:events:539:35)
at endReadableNT (node:internal/streams/readable:1345:12)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
config: {
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
adapter: [Function: httpAdapter],
transformRequest: [ [Function: transformRequest] ],
transformResponse: [ [Function: transformResponse] ],
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
validateStatus: [Function: validateStatus],
headers: {
Accept: 'application/json, text/plain, */*',
'Content-Type': 'application/json',
cookie: 'a_session_console=undefined',
'User-Agent': 'axios/0.26.1',
'Content-Length': 66
},
baseURL: 'https://appwrite.thenextweb.co.za',
method: 'post',
url: '/account/sessions',
data: '{"email":"<email>","password":"<password>"}'
},
request: <ref *1> ClientRequest {
_events: [Object: null prototype] {
abort: [Function (anonymous)],
aborted: [Function (anonymous)],
connect: [Function (anonymous)],
error: [Function (anonymous)],
socket: [Function (anonymous)],
timeout: [Function (anonymous)],
prefinish: [Function: requestOnPrefinish]
},
_eventsCount: 7,
_maxListeners: undefined,
outputData: [],
outputSize: 0,
writable: true,
destroyed: false,
_last: true,
chunkedEncoding: false,
shouldKeepAlive: false,
maxRequestsOnConnectionReached: false,
_defaultKeepAlive: true,
useChunkedEncodingByDefault: true,
sendDate: false,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
_contentLength: null,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
_closed: false,
socket: TLSSocket {
_tlsOptions: [Object],
_secureEstablished: true,
_securePending: false,
_newSessionPending: false,
_controlReleased: true,
secureConnecting: false,
_SNICallback: null,
servername: 'appwrite.thenextweb.co.za',
alpnProtocol: false,
authorized: true,
authorizationError: null,
encrypted: true,
_events: [Object: null prototype],
_eventsCount: 10,
connecting: false,
_hadError: false,
_parent: null,
_host: 'appwrite.thenextweb.co.za',
_readableState: [ReadableState],
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: undefined,
_server: null,
ssl: [TLSWrap],
_requestCert: true,
_rejectUnauthorized: true,
parser: null,
_httpMessage: [Circular *1],
[Symbol(res)]: [TLSWrap],
[Symbol(verified)]: true,
[Symbol(pendingSession)]: null,
[Symbol(async_id_symbol)]: 9,
[Symbol(kHandle)]: [TLSWrap],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: false,
[Symbol(kSetKeepAlive)]: true,
[Symbol(kSetKeepAliveInitialDelay)]: 60,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(connect-options)]: [Object],
[Symbol(RequestTimeout)]: undefined
},
_header: 'POST /account/sessions HTTP/1.1\r\n' +
'Accept: application/json, text/plain, */*\r\n' +
'Content-Type: application/json\r\n' +
'cookie: a_session_console=undefined\r\n' +
'User-Agent: axios/0.26.1\r\n' +
'Content-Length: 66\r\n' +
'Host: appwrite.thenextweb.co.za\r\n' +
'Connection: close\r\n' +
'\r\n',
_keepAliveTimeout: 0,
_onPendingData: [Function: nop],
agent: Agent {
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
defaultPort: 443,
protocol: 'https:',
options: [Object: null prototype],
requests: [Object: null prototype] {},
sockets: [Object: null prototype],
freeSockets: [Object: null prototype] {},
keepAliveMsecs: 1000,
keepAlive: false,
maxSockets: Infinity,
maxFreeSockets: 256,
scheduling: 'lifo',
maxTotalSockets: Infinity,
totalSocketCount: 1,
maxCachedSessions: 100,
_sessionCache: [Object],
[Symbol(kCapture)]: false
},
socketPath: undefined,
method: 'POST',
maxHeaderSize: undefined,
insecureHTTPParser: undefined,
path: '/account/sessions',
_ended: true,
res: IncomingMessage {
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 4,
_maxListeners: undefined,
socket: [TLSSocket],
httpVersionMajor: 1,
httpVersionMinor: 1,
httpVersion: '1.1',
complete: true,
rawHeaders: [Array],
rawTrailers: [],
aborted: false,
upgrade: false,
url: '',
method: null,
statusCode: 404,
statusMessage: 'Not Found',
client: [TLSSocket],
_consuming: true,
_dumped: false,
req: [Circular *1],
responseUrl: 'https://appwrite.thenextweb.co.za/account/sessions',
redirects: [],
[Symbol(kCapture)]: false,
[Symbol(kHeaders)]: [Object],
[Symbol(kHeadersCount)]: 18,
[Symbol(kTrailers)]: null,
[Symbol(kTrailersCount)]: 0,
[Symbol(RequestTimeout)]: undefined
},
aborted: false,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
reusedSocket: false,
host: 'appwrite.thenextweb.co.za',
protocol: 'https:',
_redirectable: Writable {
_writableState: [WritableState],
_events: [Object: null prototype],
_eventsCount: 3,
_maxListeners: undefined,
_options: [Object],
_ended: true,
_ending: true,
_redirectCount: 0,
_redirects: [],
_requestBodyLength: 66,
_requestBodyBuffers: [],
_onNativeResponse: [Function (anonymous)],
_currentRequest: [Circular *1],
_currentUrl: 'https://appwrite.thenextweb.co.za/account/sessions',
[Symbol(kCapture)]: false
},
[Symbol(kCapture)]: false,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kOutHeaders)]: [Object: null prototype] {
accept: [Array],
'content-type': [Array],
cookie: [Array],
'user-agent': [Array],
'content-length': [Array],
host: [Array]
}
},
response: {
status: 404,
statusText: 'Not Found',
headers: {
server: 'nginx/1.23.1',
date: 'Sat, 23 Jul 2022 02:12:21 GMT',
'content-type': 'application/json; charset=UTF-8',
'transfer-encoding': 'chunked',
connection: 'close',
'cache-control': 'no-cache, no-store, must-revalidate',
expires: '0',
pragma: 'no-cache',
'x-debug-speed': '0.00039100646972656'
},
config: {
transitional: [Object],
adapter: [Function: httpAdapter],
transformRequest: [Array],
transformResponse: [Array],
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
validateStatus: [Function: validateStatus],
headers: [Object],
baseURL: 'https://appwrite.thenextweb.co.za',
method: 'post',
url: '/account/sessions',
data: '{"email":"<email>","password":"<password>"}'
},
request: <ref *1> ClientRequest {
_events: [Object: null prototype],
_eventsCount: 7,
_maxListeners: undefined,
outputData: [],
outputSize: 0,
writable: true,
destroyed: false,
_last: true,
chunkedEncoding: false,
shouldKeepAlive: false,
maxRequestsOnConnectionReached: false,
_defaultKeepAlive: true,
useChunkedEncodingByDefault: true,
sendDate: false,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
_contentLength: null,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
_closed: false,
socket: [TLSSocket],
_header: 'POST /account/sessions HTTP/1.1\r\n' +
'Accept: application/json, text/plain, */*\r\n' +
'Content-Type: application/json\r\n' +
'cookie: a_session_console=undefined\r\n' +
'User-Agent: axios/0.26.1\r\n' +
'Content-Length: 66\r\n' +
'Host: appwrite.thenextweb.co.za\r\n' +
'Connection: close\r\n' +
'\r\n',
_keepAliveTimeout: 0,
_onPendingData: [Function: nop],
agent: [Agent],
socketPath: undefined,
method: 'POST',
maxHeaderSize: undefined,
insecureHTTPParser: undefined,
path: '/account/sessions',
_ended: true,
res: [IncomingMessage],
aborted: false,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
reusedSocket: false,
host: 'appwrite.thenextweb.co.za',
protocol: 'https:',
_redirectable: [Writable],
[Symbol(kCapture)]: false,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kOutHeaders)]: [Object: null prototype]
},
data: {
message: 'Not Found',
code: 404,
type: 'general_route_not_found',
version: '0.15.2'
}
},
isAxiosError: true,
toJSON: [Function: toJSON]
}
โ Error: Request failed with status code 404
Sorry, an error occured while the setup. The full logs can be found above.
Hi, loving the project so far.
May I suggest disabling ZIP file generation and also disabling "Download all" button for single-file shares.
Makes no sense to download a zip file with one file in it
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.